Professional canvas engine with pressure-sensitive brushes, scene graph, real-time collaboration, and 60 FPS GPU rendering.
↑ Interactive — try drawing above
Capabilities
A complete engine — not a widget. Drawing, rendering, collaboration, and export in one package.
Fine Pen, Thick Marker, Soft Pencil, Calligraphy Nib, Technical Pen, and Highlighter — a fully programmable brush engine with GPU-accelerated rendering.
13+ typed nodes, hierarchical transforms, spatial indexing with R-tree, and O(log n) viewport culling.
Multi-user editing with CRDT vector clock, cursor presence, element locking, and offline queue with automatic replay.
Tile-cached rendering, LOD cross-fade, frame budget manager, object pooling, and isolate rasterization for complex scenes.
Pure dependency injection via FlueraCanvasConfig. No Firebase, no backend, no
platform-specific code required.
PNG, JPEG, WebP with configurable DPI, SVG vector export, and PDF output. Per-node, selection, or full canvas.
Brush Toolkit
A fully programmable brush engine — pressure dynamics, tilt, velocity curves, ink physics, textures, and stamp dynamics. All GPU-accelerated.
Precise, clean lines for detailed work
Bold, expressive strokes
Natural graphite feel with texture
Angle-sensitive elegant writing
Consistent width for diagrams
Semi-transparent for annotations
Fully programmable: pressure curves, tilt & velocity, ink physics, textures, stamp dynamics, stabilizer, and Display P3 color.
Quick Start
Drop FlueraCanvasScreen
into your widget tree.
Add a storage adapter for persistence. That's it — you get an infinite canvas with 12 brushes,
undo/redo, zoom/pan, and auto-save out of the box.
flutter pub add fluera_engine
Create a FlueraCanvasConfig with your adapters
Ship your app 🚀
import 'package:flutter/material.dart';
import 'package:fluera_engine/fluera_engine.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Zero-config local persistence
final storage = SqliteStorageAdapter();
await storage.initialize();
runApp(MaterialApp(
theme: ThemeData.dark(useMaterial3: true),
home: FlueraCanvasScreen(
config: FlueraCanvasConfig(
layerController: LayerController(),
storageAdapter: storage,
),
),
));
}
Architecture
Dependency injection means every feature is optional. Activate only what you need.
FlueraCanvasScreen └── FlueraCanvasConfig ├── storageAdapter → Local persistence (SQLite) ├── cloudAdapter → Cloud sync (any backend) ├── realtimeAdapter → Real-time collaboration ├── pdfProvider → PDF rendering ├── permissions → Access control ├── presence → User presence └── voiceRecording → Audio notes
Start building with Fluera Engine today. Free and open-source under the BSD 3-Clause License.