Bug fixes (Flutter): - Wrap multi-statement DB writes (insert/update/delete note, deleteDocument, deletePageData, OCR FTS merge, migrations) in transactions to prevent data loss on interruption and a read-modify-write FTS race. - Fix PdfDocument leaks on exception (try/finally dispose) and preserve image aspect ratio when stamping images onto PDF pages. - Guard file-picker against empty selection (was .single -> crash). - Fix eraser ConcurrentModificationError and unmodifiable-list crash on PDF pages; capture page synchronously on save to stop wrong-page data loss. - Fix Riverpod DB-not-ready races, broken pull-to-refresh, settings load race, and search N+1; transform stored annotations on PDF page rotation. - Normalize pen pressure for devices without a pressure range. - PPT: single source of truth for slide strokes so ink displays and exports. UI/UX: - Material 3 typography, theme-aware colors (dark-mode fixes), hover cursors and right-click/visible actions on desktop, keyboard shortcuts (undo/redo/ save/find), toolbar overflow handling, friendlier empty states, semantic OCR status badges, relative timestamps, 1-based page indicators, large-deck PPT navigation, and a scratchpad-scope label in split view. Server (optional backend): - Persist JWT secret (was per-process random), block path traversal in storage, fix CORS '*'+credentials, add OCR job ownership checks, last-writer-wins sync guard, constant-time login, and split out heavy OCR deps so the API/tests run without them. CI: Gitea workflows for format+analyze+test (Linux, system sqlite) and a Windows release build; pristine `flutter analyze`, all Flutter and server tests green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
68 lines
1.9 KiB
Markdown
68 lines
1.9 KiB
Markdown
# BadNote
|
|
|
|
Local-first Surface Pen note-taking app with PDF/PPT annotation.
|
|
|
|
All notes, documents, search, and OCR run on your device. No server is required to use the app.
|
|
|
|
## Features
|
|
|
|
- Ink notes with Surface Pen (pressure, stabilizer, undo/redo)
|
|
- PDF and PPT import with page-level annotation
|
|
- Full-text search over note titles, typed text, and OCR results
|
|
- **Local OCR** — handwriting recognition via Windows built-in OCR (Windows desktop)
|
|
|
|
## Build (Windows)
|
|
|
|
Prerequisites:
|
|
|
|
- Flutter SDK (3.10+)
|
|
- Visual Studio Build Tools with **Desktop development with C++**
|
|
- Developer Mode enabled (for Flutter plugin symlinks)
|
|
|
|
```powershell
|
|
flutter pub get
|
|
flutter build windows --release
|
|
```
|
|
|
|
Output: `build\windows\x64\runner\Release\badnote.exe`
|
|
|
|
If native asset downloads fail (e.g. sqlite3), set a proxy before building:
|
|
|
|
```powershell
|
|
$env:HTTP_PROXY="http://127.0.0.1:7890"
|
|
$env:HTTPS_PROXY="http://127.0.0.1:7890"
|
|
flutter build windows --release
|
|
```
|
|
|
|
## Architecture
|
|
|
|
```
|
|
lib/
|
|
├── screens/ # UI (notes, PDF/PPT annotator, search, settings)
|
|
├── services/ # Local business logic
|
|
│ ├── database_service.dart # SQLite + FTS5
|
|
│ ├── ocr_service.dart # Local OCR orchestration
|
|
│ ├── stroke_rasterizer.dart # Ink → PNG for OCR
|
|
│ └── ocr_engine.dart # Platform OCR bridge
|
|
├── providers/ # Riverpod state
|
|
└── widgets/ # Ink canvas, toolbars, thumbnails
|
|
```
|
|
|
|
OCR flow on save:
|
|
|
|
1. Extract typed text from text-tool strokes
|
|
2. Rasterize handwriting strokes to PNG
|
|
3. Run Windows OCR on the PNG
|
|
4. Merge recognized text into the local FTS index for search
|
|
|
|
## Optional server
|
|
|
|
The `server/` directory contains an experimental FastAPI backend (sync + EasyOCR). It is **not required** for the desktop app and is kept separately for future multi-device sync experiments. See [server/README.md](server/README.md).
|
|
|
|
## Development
|
|
|
|
```bash
|
|
flutter run -d windows
|
|
flutter test
|
|
```
|