Initial project setup with README, CLAUDE.md (AI dev context), DESIGN.md (full technical design covering architecture, data model, coordinate system, rendering strategy), PROJECT_PLAN.md (phased implementation steps), and PROGRESS.md (completion tracking). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.4 KiB
4.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
eng-pad is an Android note-taking app built around notebooks with an EMR pen as the primary input method. Target devices are the Supernote Manta (Android 11) and Daylight DC-1 (Android 13). Minimum API level is Android 11 (API 30).
Build Commands
./gradlew build # Compile everything
./gradlew test # Run unit tests
./gradlew lint # Run Android Lint
./gradlew installDebug # Install debug APK to connected device
# Run a single test class:
./gradlew test --tests "net.metacircular.engpad.data.StrokeBlobTest"
Architecture
- Kotlin + Jetpack Compose for UI chrome (screens, toolbar, dialogs)
- Custom View (
PadCanvasView) for the drawing canvas — Compose Canvas lacksMotionEventaccess needed for stylus input - Room (SQLite) for persistence — notebooks, pages, strokes
- Single Activity with Compose Navigation (three screens: notebook list → page list → editor)
- Coordinate system: 300 DPI canonical points. Regular page = 2550×3300pt, large = 3300×5100pt. Scaled to 72 DPI (×0.24) for PDF export.
- Input dispatch:
TOOL_TYPE_STYLUS→ draw/erase/select,TOOL_TYPE_FINGER→ zoom/pan
Project Documents
- DESIGN.md — Full technical design (architecture, data model, rendering, source tree)
- PROJECT_PLAN.md — All implementation steps with checkboxes. Check off steps as completed.
- PROGRESS.md — What's been done, what's in progress, decisions made. Update after every step.
Keep PROJECT_PLAN.md and PROGRESS.md in sync. When a step is completed, check it off in PROJECT_PLAN.md and log it in PROGRESS.md. When files are added, update the source tree in both DESIGN.md and this file.
Source Tree
eng-pad/
├── app/
│ ├── build.gradle.kts -- Module build config
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/net/metacircular/engpad/
│ │ │ ├── EngPadApp.kt -- Application class
│ │ │ ├── MainActivity.kt -- Single activity, Compose NavHost
│ │ │ ├── data/
│ │ │ │ ├── db/ -- Room database, DAOs, converters
│ │ │ │ ├── model/ -- Entities: Notebook, Page, Stroke, PageSize
│ │ │ │ └── repository/ -- NotebookRepository, PageRepository
│ │ │ ├── ui/
│ │ │ │ ├── navigation/NavGraph.kt -- Route definitions
│ │ │ │ ├── notebooks/ -- List screen + ViewModel
│ │ │ │ ├── pages/ -- Page grid screen + ViewModel
│ │ │ │ ├── editor/ -- PadCanvasView, EditorScreen, ViewModel
│ │ │ │ ├── export/PdfExporter.kt -- PDF generation + sharing
│ │ │ │ └── theme/Theme.kt -- Material3 theme
│ │ │ └── undo/ -- UndoManager, UndoableAction
│ │ └── res/
│ └── test/ -- Unit tests
├── build.gradle.kts -- Root build config
├── settings.gradle.kts
├── gradle.properties
├── gradle/libs.versions.toml -- Version catalog
├── CLAUDE.md -- This file
├── README.md
├── DESIGN.md -- Technical design
├── PROJECT_PLAN.md -- Implementation steps
└── PROGRESS.md -- Completion tracking
Key Conventions
- Stroke points are packed as little-endian float BLOBs:
[x0,y0,x1,y1,...] - All coordinates are in canonical space (300 DPI). Screen transform via
Matrix. - Grid spacing: 60pt (~5 squares/inch). Grid is drawn on screen, excluded from exports.
- Pen widths: 0.38mm = 4.49pt, 0.5mm = 5.91pt (at 300 DPI).
- Two pen sizes only, no pressure sensitivity.
- Hardware palm rejection only (EMR digitizer).