A full-featured handwriting note-taking app for iPad and Android tablets, built with Flutter.
  • Dart 99.6%
  • Swift 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-11 11:34:45 +01:00
android Rename the app from Notizen to Inkwell 2026-11-11 01:33:55 +01:00
integration_test Rename the app from Notizen to Inkwell 2026-11-11 01:33:55 +01:00
ios Rename the app from Notizen to Inkwell 2026-11-11 01:33:55 +01:00
lib Rename the app from Notizen to Inkwell 2026-11-11 01:33:55 +01:00
test Rename the app from Notizen to Inkwell 2026-11-11 01:33:55 +01:00
.gitignore Notizen: handwriting notes app for iOS and Android 2026-11-11 01:20:58 +01:00
.metadata Notizen: handwriting notes app for iOS and Android 2026-11-11 01:20:58 +01:00
analysis_options.yaml Notizen: handwriting notes app for iOS and Android 2026-11-11 01:20:58 +01:00
pubspec.lock Notizen: handwriting notes app for iOS and Android 2026-11-11 01:20:58 +01:00
pubspec.yaml Rename the app from Notizen to Inkwell 2026-11-11 01:33:55 +01:00
README.md README: link the 1.0.0 release 2026-11-11 11:34:45 +01:00

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: UIFileSharingEnabled and LSSupportsOpeningDocumentsInPlace are on, so notebooks show up in the Files app.
  • Android: the app id is com.inkwell.inkwell, label Inkwell.

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