
duoduo
A gamified, AI-powered Flutter app that lets you create custom question decks from text, images, and shared content to learn with XP, streaks, achievements, and multiple quiz modes.
It provides a typed, native Flutter API for semantic video search using natural language, speech, text, and imagery, with streaming uploads and full cancellation support.
VModal for Flutter Give your Android and iOS apps a multimodal memory. Upload video. Find moments by meaning, speech, text, or imagery.Keep the experience fast, native, and 100% Flutter.
Turn every video library into an experience your users can explore.
VModal brings multimodal video search and mobile-friendly uploads to Dart with a small, typed API. Your app owns the interface; the SDK handles the VModal gateway, request models, responses, upload streams, progress, and cancellation.
| Your Flutter experience | VModal gives you |
|---|---|
| “Find the cyclist in the red jacket” | Semantic video and image search |
| Search words spoken or shown on screen | ASR and OCR search sources |
| Upload from a picker or camera flow | Streamed, signed uploads with live progress |
| A cancel button that really cancels | Per-operation cancellation tokens |
| Collection and indexing screens | Typed collection, index, usage, and image resources |
| Login and account switching your way | App-owned runtime credentials—no login UI imposed |
The public package source is available on GitHub. Add it to your app:
dependencies:
vmodal_sdk_flutter:
git:
url: https://github.com/v-modal/vmodal_sdk_flutter.git
ref: main
Then run:
flutter pub get
Create one client from the API key already loaded by your authenticated app:
import 'package:vmodal_sdk_flutter/vmodal_sdk_flutter.dart';
final keys = MutableApiKeyProvider(runtimeApiKey);
final vmodal = VmodalClient(
config: SdkConfig(apiKeyProvider: keys),
);
The SDK never owns your login screen or persists your API key. It receives an in-memory credential from your application at runtime.
final groups = await vmodal.collections.listGroups(mode: 'vid_file');
if (groups.data.isEmpty) {
throw StateError('No video collection exists for this API key');
}
final group = groups.data.first;
final version = group.latestLancedbVersion;
if (version == null) {
throw StateError('The collection has no searchable LanceDB version');
}
final results = await vmodal.searches.searchVideo(
SearchRequest(
queryText: 'the cyclist crossing the bridge at sunset',
groupName: group.groupName,
searchSources: const ['image'],
versionLancedb: ver
V- Modal AI: Search anything anywhere SDK Flutter