An Android app for capturing handwritten fountain-pen notes, recognizing text, and preserving detected ink colours. This public build is 100% offline and FOSS: two bundled on-device recognition strategies are available. Cursive (the default) targets handwriting and Printed targets printed text. Choose the default under Settings → Default recognition; when capturing with the camera, you can also pick a strategy for that one photo.
After a new image is recognized and saved, the app opens a review screen containing every generated paragraph note. Correct any transcription in place, then choose Done to save the changed notes and return to the list. Leaving with unsaved corrections asks for confirmation; discarding those corrections does not remove the already captured notes.
Press and hold a note in the list to select it. Tap rows or their checkboxes to change the selection, or use Select all to select every note in the list, including those off screen. Clear the last selection or press Back to return to opening notes normally.
Choose Delete selected and confirm once to permanently delete the selection. Shared source images remain until their last note is deleted. If deletion fails, the app stops and keeps remaining notes selected after refreshing; review the selection before trying again. If refresh fails, use Retry first.
Tap the search icon in the notes list to search note text, tags and ink colour names. The search is fuzzy: it ignores case and accents and tolerates small recognition typos. Every word you type must match. While a search is active, results are ranked by relevance (within each type section when Zettelkasten organisation is enabled); clear the search to return to date order. When Zettelkasten organisation is enabled, use the Fleeting, Literature and Permanent chips to show only those types. With no chip selected, every type is shown. Select all and other selection actions apply only to the notes that are visible.
Choose Export all to Markdown vault from the notes list's overflow menu. To
export only some notes, select them and choose Share selected → Markdown vault
(Obsidian). Pick where to save the .zip, then unzip it and open the folder
as an Obsidian vault. Logseq, Zettlr, Foam and other Markdown tools can open it too.
Each note becomes a Markdown file with YAML front matter: creation time, type,
tags, ink colour and recognition details. Each file embeds its source image
from attachments/, and links between notes become [[wikilinks]].
FPInk index.md lists every exported note. When Zettelkasten organisation is
enabled, notes go into Fleeting/, Literature/ and Permanent/ folders and
are tagged zettelkasten/<type>. The export stays on the device; FPInk only
writes to the location you pick.
Use JDK 17 and Android SDK 37.
Run .\gradlew.bat build on Windows or ./gradlew build on Linux.
The published APK contains arm64-v8a native code only, so it installs on
ARM64 devices. Both strategies run on ONNX Runtime with bundled, SHA-256-pinned
models: the official PP-OCRv6 small detector and medium recognizer (Printed),
and a Kraken PP-OCRv6-medium recognizer (Cursive). The app never downloads or
substitutes model bytes at runtime. The public
build requests no network permissions. Release builds run on ONNX Runtime
built from source with telemetry compiled out
(recognition/onnxruntime), and ONNX
Runtime's telemetry initializer is removed from every build. Release builds
are shrunk with R8.
See architecture, bundled recognition models, recognition strategies, release setup and versioning, and the F-Droid submission and maintenance runbook.
Copyright (C) 2026 FPInk contributors.
FPInk's original source code is licensed under the GNU General Public License,
version 3 only (GPL-3.0-only). You may redistribute and modify it under those
terms. FPInk comes without any warranty, including implied warranties of
merchantability or fitness for a particular purpose. See LICENSE for
the complete terms.
Third-party dependencies and bundled assets retain their own licenses; this does not relicense their authors' work. Model provenance, licences, bundled notices and current limitations are documented in recognition/models. When distributing an APK, provide its corresponding source and preserve those notices; the release workflow links each APK to its exact tagged source.