Security & Data Practices
How InkLift handles, protects, and processes your data.
📊 Data Collection
InkLift collects only the data necessary to provide handwriting OCR and sync services:
- Account information: your email address and a securely hashed password (bcrypt).
- Device credentials: API tokens for your e-ink tablet (reMarkable, Boox, Supernote, Kindle Scribe) used to fetch your notebooks. These are encrypted at rest (see Encryption below).
- Notebook page images: rendered PNG images of your handwritten pages, temporarily stored for OCR processing.
- OCR results: the converted text and confidence scores from your handwritten pages.
- Sync metadata: timestamps, job statuses, and content hashes to enable efficient delta sync without re-downloading unchanged pages.
- Usage data: subscription tier, pages processed count, and billing identifiers (Stripe customer ID). We do not store payment card details — Stripe handles all payment processing.
🔒 Encryption
Your device credentials (API tokens, OAuth tokens) are encrypted at rest using AES-256 via Fernet from the cryptography Python library.
- A 256-bit encryption key is derived from the application secret using SHA-256.
- Fernet provides authenticated encryption — each encrypted blob includes an HMAC signature that prevents tampering.
- Encrypted credential blobs are stored in the database as binary data; they cannot be read without the server-side secret key.
- Passwords are never stored in plain text — they are hashed using bcrypt with a per-user salt.
- All connections between your browser and InkLift are encrypted using TLS (HTTPS).
👁 OCR Processing
InkLift uses the Google Gemini 2.0 Flash Vision API for handwriting recognition. Here is how your data flows during OCR:
- Image transmission: page images (PNG or PDF) are sent to Google's Gemini API as inline data within the API request. The images are transmitted over an encrypted (TLS) connection.
- Processing: Gemini analyses the handwritten content and returns the recognized text. InkLift uses a low-temperature setting (0.1) for accurate, deterministic output.
- Google's data retention: per Google's API terms of service, data sent via the Gemini API is not used to train Google's models when accessed through a paid API key. Refer to Google's AI Terms of Service for the latest policy.
- No third-party sharing: your page images and OCR results are not shared with any party other than Google (for processing) and your configured sync destinations (e.g., Obsidian).
- Retry handling: if OCR fails, InkLift retries up to 3 times with exponential backoff. Failed attempts are logged without exposing your content.
📅 Data Retention
InkLift retains your data only as long as needed to provide the service:
- Page images: stored on the server for OCR processing and re-processing (e.g., if you trigger a manual re-OCR). Images remain available while your account is active.
- OCR text and embeddings: stored in PostgreSQL alongside vector embeddings for semantic search. Retained while your account is active.
- Sync job history: job status records (pending, completed, failed) are retained for troubleshooting and analytics.
- Account data: your account information is retained until you delete your account. Soft-deleted records (with a
deleted_attimestamp) may be retained for a limited period to allow recovery.
🗑 Deletion Rights
You have the right to delete your data at any time:
- Account deletion: you can request account deletion by contacting us at support@inklift.com. This removes your account, devices, notebooks, pages, OCR results, and all associated data.
- Device disconnection: you can disconnect a device from your Account settings page, which removes the stored (encrypted) credentials for that device.
- Individual notes: you can delete individual notes and their OCR results through the dashboard.
- Sync destination data: data already synced to external services (e.g., your Obsidian vault) is managed by those services and is not affected by deletion within InkLift.
- Stripe billing data: billing records maintained by Stripe are subject to Stripe's own data retention policies.
🛡 Security Measures
InkLift implements multiple layers of security to protect your account and data:
- Authentication: JWT-based session tokens with short-lived access tokens (30-minute expiry) and longer-lived refresh tokens (7-day expiry). Web sessions use secure, HTTP-only cookies.
- Multi-factor authentication (MFA): optional TOTP-based MFA for additional account security.
- Rate limiting: authentication endpoints and sensitive operations are rate-limited to prevent brute-force attacks.
- HSTS & transport security: HTTP Strict Transport Security headers ensure all traffic is encrypted. CORS and Content Security Policy headers restrict cross-origin access.
- Input validation: all API inputs are validated using Pydantic models with strict type checking.
- Structured logging: security-relevant events are logged using structured JSON logging with PII redaction to prevent accidental data exposure in logs.
- Infrastructure: the application runs on dedicated infrastructure with PostgreSQL and Redis services isolated via Docker containers.
- Dependency management: dependencies are managed via
uvwith pinned versions and regular updates.
Questions about our security practices? Contact us at support@inklift.com.
Last updated: April 2026