BlankType is a local-first note-taking app built with Electron, React, and TypeScript.
- Rich-text notes and folders
- Pinning, reminders, search, and recently deleted notes
- Local SQLite storage
- Multi-device sync through Google Drive, OneDrive, Amazon S3, or Cloudflare R2
- Optional end-to-end encryption
- Offline editing and conflict resolution
- Light and dark themes
Requirements:
- Node.js 24 or later
- pnpm 11
pnpm install
pnpm devAvailable commands:
pnpm test # run tests
pnpm check # format, lint, and type-check
pnpm build # create production bundles
pnpm package # create an unpacked desktop application
pnpm make # create an installerCloud sync is local-first. Edits are saved to SQLite immediately and uploaded after a short idle period. Continuous editing is checkpointed every 30 seconds. Concurrent changes from different devices are kept until the user resolves them.
Only one provider can be active at a time.
Create a Google OAuth desktop client, enable the Drive API, and provide the client ID when building:
BLANKTYPE_GOOGLE_CLIENT_ID=your-client-id pnpm buildThe app requests the drive.appdata scope and stores data in the hidden application-data folder.
Register a public desktop application in Microsoft Entra ID with:
- Personal and organizational account support
- A loopback desktop redirect URI
- Delegated
Files.ReadWrite.AppFolderpermission
Then provide the application client ID:
BLANKTYPE_MICROSOFT_CLIENT_ID=your-client-id pnpm buildNo Microsoft client secret is used.
Use a dedicated IAM identity restricted to the selected bucket and prefix. The app requires:
s3:ListBuckets3:GetObjects3:PutObjects3:DeleteObject
The default prefix is .blanktype-sync/v1/.
Create a bucket-scoped R2 API token with object read/write access. Enter the account ID, bucket, access key ID, and secret in the application settings.
- OAuth uses Authorization Code with PKCE and the system browser.
- Provider credentials stay in the Electron main process.
- Persisted secrets use Electron
safeStorage. - Encrypted vaults use scrypt and AES-256-GCM.
- Recovery keys are displayed once and are not stored remotely in plaintext.
Cloud providers can still observe object sizes, counts, and update times.
electron/ Electron main process, persistence, authentication, and sync
src/ React application
resources/ Application assets
MIT