- Dart 99.6%
- Swift 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| android | ||
| integration_test | ||
| ios | ||
| lib | ||
| test | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
Inkwell
A handwriting-first note-taking app for iOS and Android, in the spirit of Goodnotes, OneNote and Notability: pressure-sensitive ink, a highlighter that sits under your writing, shapes, a lasso for rearranging ink, typed text blocks, paper templates and a cover-and-folder library.
Everything is local — notes are plain JSON in the app's documents directory, one file per notebook, with a small index so the library opens instantly.
Download
Prebuilt 1.0.0 artifacts are on the release page:
Inkwell-1.0.0-arm64-v8a.apk— most Android devices (17 MB)Inkwell-1.0.0-armeabi-v7a.apk— older 32-bit Android devices (15 MB)Inkwell-1.0.0-universal.apk— any Android device, all ABIs (50 MB)Inkwell-1.0.0-unsigned.ipa— iOS, needs re-signing with your own Apple ID
Running
flutter pub get
flutter run # pick a connected device / simulator
flutter test # unit + widget tests
flutter test integration_test/app_tour_test.dart -d <device-id> # end-to-end tour
What is in the box
| Area | Where |
|---|---|
| Data model (notebooks, pages, elements) | lib/models/ |
| Ink engine (variable width, smoothing, simplification) | lib/painting/ink_geometry.dart |
| Painters (paper, elements, live ink, lasso, previews) | lib/painting/page_painter.dart |
| JSON persistence, PNG export | lib/services/storage_service.dart |
| Viewport (zoom / pan / pinch) | lib/state/viewport_controller.dart |
| Editor state (undo/redo, selection, autosave) | lib/state/editor_controller.dart |
| Library state (search, sort, folders, favourites) | lib/state/library_controller.dart |
| Screens | lib/screens/ |
| Widgets (canvas, tool dock, page navigator, sheets) | lib/widgets/ |
Design notes
Page coordinates. Everything on a page is stored in A4 page units
(kPageSize = 1000 × 1414). The canvas draws into that space and the viewport applies a
single Transform, so zooming and panning never touch the geometry and ink stays sharp
at any scale.
Ink. A stroke is a list of points with pressure. InkGeometry smooths the polyline
(Chaikin), builds a variable-width outline from the pressure values and drops points that
carry no visual information (Douglas–Peucker). Width follows a square-root response so a
light stylus touch is still legible.
Undo. Elements are immutable, so a snapshot is just a list of references. Each gesture (one stroke, one eraser drag, one lasso move) is grouped into a single undo step; the history holds the last 80 steps.
Rendering order. Highlighters are painted in a first pass, so a highlight always ends up under pen ink and text — the way a real marker behaves.
Notes on the build
- iOS:
UIFileSharingEnabledandLSSupportsOpeningDocumentsInPlaceare on, so notebooks show up in the Files app. - Android: the app id is
com.inkwell.inkwell, labelInkwell.
Both targets build from this tree:
flutter build ios --simulator # or: flutter build ipa
export JAVA_HOME=$(/opt/homebrew/bin/brew --prefix openjdk@25)/libexec/openjdk.jdk/Contents/Home
flutter build apk --release # JAVA_HOME is needed: no JDK is on PATH by default