Notlify is a MacOS productivity tool that allows users to capture multi-media contents and generates notes into their Notion workspace by clicking a simple shortcut.
- 🎯 Global Shortcut: Simple shortcut
⌘⌃'to capture articles from browsers (TODO: Youtube videos, PDFs, Podcasts) - 🔄 Notion Auto Sync: Automatically save AI summarized markdown-styled notes to selected database from Notion workspace
- 🌐 Browser compatibility: Supports Safari and Chrome (TODO: make it browser independent)
- 🤖 AI Content Analysis / Categorization: AI automatically analyzes content, summarize, and categorize
- Desktop App: Electron + React + TypeScript
- Backend: FastAPI + Python + SQLAlchemy
- AI Processing: Gemini 2.5 flash Lite
- Database: MySQL
- Integrations: Notion API via notion-client-py
- Node.js (v18 or later)
- Python 3.11+
- macOS (required for global shortcuts and AppleScript)
cd server
# Setup virtual environment
uv venv
source .venv/bin/activate
# Install dependencies
uv pip install -r requirements.txt
# Start development server
uv run python -m app # Starts server on http://localhost:8000Test Users Created:
- Email:
test@notlify.com| Password:testpass123
cd desktop
npm install
npm run dev # Development mode
# OR
npm run build # Build for production
npm start # Run built app- Start the backend server (see setup above)
- Launch the desktop app
- Use the global shortcut
⌘⌃'anywhere on macOS - Content will be automatically captured from your active browser tab
- View the captured content in the app interface
# Notlify Backend Environment Variables
# Database Configuration
NOTLIFY_DB_HOST=
NOTLIFY_DB_USER=
NOTLIFY_DB_PASSWORD=
NOTLIFY_DB_NAME=
# JWT Authentication
NOTLIFY_JWT_SECRET_KEY=
NOTLIFY_JWT_ALGORITHM=HS256
NOTLIFY_JWT_ACCESS_TOKEN_EXPIRE_MINUTES=60
NOTLIFY_JWT_REFRESH_TOKEN_EXPIRE_MINUTES=43200
# Notion OAuth Configuration
NOTLIFY_NOTION_OAUTH_CLIENT_ID=
NOTLIFY_NOTION_OAUTH_CLIENT_SECRET=
NOTLIFY_NOTION_OAUTH_REDIRECT_URI=
# Encryption for storing sensitive data (must be exactly 32 bytes)
NOTLIFY_ENCRYPTION_KEY=notlify-encryption-key-32bytes!
# Gemini AI Configuration
NOTLIFY_GEMINI_API_KEY=
NOTLIFY_GEMINI_MODEL=
# Application Settings
DEBUG=True
ENV=dev
NOTLIFY_CORS_ALLOWED_ORIGIN=["http://localhost:3000","http://localhost:8080","http://127.0.0.1:3000"]
# Mailgun Configuration
NOTLIFY_MAILGUN_API_KEY=
NOTLIFY_MAILGUN_DOMAIN=