Snow Draw is a whiteboard application focused on fast interaction, predictable editing behavior, and backend-agnostic rendering architecture.
The workspace is organized so drawing domain logic is independent from Flutter rendering details. This keeps the core portable and allows adding new rendering backends without rewriting reducers, element models, history, or input behavior.
packages/snow_draw_core: pure Dart engine (state/actions/reducers, geometry, scene contracts, serialization).packages/snow_draw_flutter_backend: Flutter backend (painters, scene primitive renderer, text/shader caches, canvas widgets).apps/snow_draw: app composition layer (toolbars, adapters,DefaultDrawStore,ToolController).
Rendering follows an explicit engine/backend split:
- Core compiles document state into backend-agnostic scene primitives.
- Backend renders those primitives with platform APIs.
- App imports backend via package entrypoints only.
This mirrors modern draw-list pipelines (similar in spirit to egui/iced): core owns intent and geometry, backend owns paint execution.
Boundary checks are enforced with Melos scripts:
dart run melos run check:core-puritydart run melos run check:core-draw-puritydart run melos run check:core-ui-boundarydart run melos run check:backend-legacydart run melos run check:backend-app-import-boundarydart run melos run check:backend-pubspec-boundarydart run melos run check:backend-dependency-graphdart run melos run check:backend-entrypointdart run melos run check:ci-workflowdart run melos run check:app-backend-import-boundarydart run melos run check:app-pubspec-backenddart run melos run check:app-dependency-graphdart run melos run check:architecturedart run melos run check:compatibility-contracts
check:compatibility-contracts runs focused schema/type compatibility
tests to protect persisted data and backend binding contracts.
See docs/architecture/render_backend_split.md for detailed contracts and
extension guidance.