Open-source Evernote alternative with powerful features for notes and todos management.
- 📝 Notes Management - Create, edit, organize notes with Markdown support
- ✅ Todo Management - Task tracking with priorities, due dates, reminders
- 📁 Folder Organization - Hierarchical folder/subfolder structure
- 🔍 Full-text Search - Quick search across all notes and todos
- 📅 Calendar View - Visual calendar for tasks with due dates
- 📊 Analytics - Statistics and insights
- ⭐ Favorites - Mark important items
- 📦 Archive - Archive completed items
- 🗑️ Trash - Soft delete with recovery
- 🔐 Encryption - Encrypt sensitive notes
- 📎 Attachments - File attachments for notes and todos
- 🔄 Backup & Restore - Automatic backups with configurable retention
- 🔔 Reminders - Email/Telegram/DingTalk notifications
- 👥 Sharing - Share notes and todos with other users
- 🌙 Dark Mode - Theme switching
- ⌨️ Keyboard Shortcuts - Customizable hotkeys
- 📱 Responsive Design - Works on desktop and mobile
- Java 25
- Spring Boot 4.1
- MyBatis
- SQLite (default) / PostgreSQL
- Maven
- React 18
- TypeScript
- Tailwind CSS
- Vite
- Java 25+
- Node.js 18+
- Maven 3.6+
Edit note-keeper-service/src/main/resources/application.yml:
app:
storage:
base-dir: ${user.dir}/../varattachments-dir: ${app.storage.base-dir}/attachmentsbackups-dir: ${app.storage.base-dir}/backupsdata-dir: ${app.storage.base-dir}/datadb-path: ${app.storage.data-dir}/notekeeper.dbDirectory structure:
var/
├── data/ # SQLite database
├── attachments/ # Uploaded files
└── backups/ # Backup archives
SQLite (default):
spring:
datasource:
url: jdbc:sqlite:${app.storage.db-path}PostgreSQL:
spring:
profiles:
active: postgresqldatasource:
url: jdbc:postgresql://localhost:5432/notekeeperusername: your_usernamepassword: your_passwordRun schema migration:
psql -U your_username -d notekeeper -f note-keeper-service/src/main/resources/schema-postgresql.sqlGenerate encryption key using Java:
cd note-keeper-service
mvn compile exec:java -Dexec.mainClass="xyz.crearts.note.keeper.service.EncryptionService" -Dexec.classpathScope=compileOr manually in code:
Stringkey = EncryptionService.generateKey();
System.out.println(key); // Copy this keySet the key in application.yml:
app:
encryption:
key: "your-generated-base64-key-here"Or use environment variable:
export ENCRYPTION_KEY="your-generated-base64-key-here"Important:
- Without a fixed key, encrypted notes will be unreadable after restart
- Store key securely (password manager, secrets vault)
- Key is 256-bit AES (Base64 encoded = 44 characters)
- Once set, never change it or you'll lose access to encrypted notes
Default credentials (development only):
- Username:
admin - Password: Auto-generated on first start (check logs)
Production: Configure OAuth (Google) or LDAP.
Telegram Notifications:
app:
integrations:
telegram:
enabled: truebot-token: YOUR_BOT_TOKENchat-id: YOUR_CHAT_IDDingTalk Notifications:
app:
integrations:
dingtalk:
enabled: truewebhook: YOUR_WEBHOOK_URLsecret: YOUR_SECRETConfigure in Settings UI or application.yml:
app:
backup:
auto-enabled: truecron: "0 0 2 * * *"# Daily at 2 AMretention-days: 30cd note-keeper-service
mvn clean install
mvn spring-boot:runServer starts on http://localhost:8080
cd note-keeper-web
npm install
npm run devOr build production:
mvn clean install -pl note-keeper-webFrontend served by backend at http://localhost:8080
Needs GraalVM 25+ with native-image. On Windows use x64 Native Tools Command Prompt.
One binary = React UI + Spring API. From repo root:
mvn -Pnative native:compile
./note-keeper-service/target/note-keeper -Djavax.xml.accessExternalDTD=allDocker image (Buildpacks, JDK 25+):
mvn -pl note-keeper-service -am -Pnative spring-boot:build-imageCI image (multi-stage GraalVM):
docker build -f Dockerfile.native -t note-keeper-native .
docker run -d -p 9082:8080 \
-e SPRING_PROFILES_ACTIVE=sqlite \
-v /volume1/docker/note-keeper/etc:/app/etc:ro \
-v /volume1/docker/note-keeper-native/var:/app/var:rw \
--name note-keeper-native note-keeper-nativeGitea: HTTP registry devops.local:5000 (REGISTRY_USER / REGISTRY_PASSWORD). JVM deploy.yml — minipc build+push → NAS 9081. Native deploy-native.yml — minipc build+push → NAS 9082.
Access OpenAPI docs at: http://localhost:8080/swagger-ui.html
Key endpoints:
GET /api/v1/notes- List notesPOST /api/v1/notes- Create noteGET /api/v1/todos- List todosPOST /api/v1/backup/export- Export backupPOST /api/v1/backup/import- Import backup
Customize in Settings > Shortcuts:
Ctrl+N- New noteCtrl+T- New todoCtrl+K- SearchCtrl+B- Toggle sidebarEsc- Exit fullscreen
note-keeper/
├── note-keeper-service/ # Spring Boot backend
│ ├── src/main/java/
│ │ └── xyz/crearts/note/keeper/
│ │ ├── controller/ # REST controllers
│ │ ├── service/ # Business logic
│ │ ├── mapper/ # MyBatis mappers
│ │ ├── dto/ # Data transfer objects
│ │ └── config/ # Configuration
│ └── src/main/resources/
│ ├── application.yml # Configuration
│ ├── schema.sql # Database schema
│ └── mapper/ # MyBatis XML
├── note-keeper-web/ # React frontend
│ ├── src/
│ │ ├── pages/ # Page components
│ │ ├── components/ # Reusable components
│ │ ├── utils/ # Utilities
│ │ └── types/ # TypeScript types
│ └── package.json
└── var/ # Runtime data (auto-created)
├── data/
├── attachments/
└── backups/
- Backend: Add controller → service → mapper → DTO
- Frontend: Add page/component → update API calls
- Update schema if needed
- Test both modules
Database not created:
- Check
var/data/directory exists - Verify write permissions
- Check logs for SQLite errors
Attachments not uploading:
- Verify
var/attachments/exists - Check file size limits
- Review backend logs
Backup fails:
- Ensure
var/backups/is writable - Check disk space
- Review cron expression format
MIT License