Welcome to Note Ninja! This guide will help you set up the complete project in minutes.
Before you begin, make sure you have:
- ✅ Node.js (v18 or higher) - Download
- ✅ Chrome Browser - Download
- ✅ Notion Account - Sign up
- ✅ Git - Download
-
Navigate to the backend folder:
cd backend -
Install dependencies:
npm install
-
Configure environment variables:
- Copy
.env.exampleto.env:cp .env.example .env
- Edit
backend/.envand add your credentials:
# Notion (see Step 3 for details) NOTION_API_KEY=secret_xxxxxxxxxxxxxxxxxxxxx NOTION_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NOTION_CLIENT_SECRET=secret_xxxxxxxxxxxxxxxxxxxxx NOTION_REDIRECT_URI=http://localhost:3000/auth/callback # Google Gemini AI (get from https://aistudio.google.com/apikey) GEMINI_API_KEY=AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX GEMINI_MODEL=gemini-2.0-flash
- Copy
-
Start the backend server:
# Development mode (auto-reload) npm run dev # OR Production mode npm start
You should see:
🚀 Note Ninja Backend Server running on port 3000 📝 Environment: development 🔗 Server URL: http://localhost:3000
-
Add extension icons:
- Create or download icons for the extension
- Place them in
extension/icons/folder:icon16.png(16x16 pixels)icon48.png(48x48 pixels)icon128.png(128x128 pixels)
-
Load the extension in Chrome:
- Open Chrome and go to
chrome://extensions/ - Enable "Developer mode" (toggle in top-right corner)
- Click "Load unpacked"
- Select the
extensionfolder from this project - The Note Ninja extension should now appear in your extensions list
- Open Chrome and go to
-
Update CORS settings:
- After loading the extension, copy its ID from the extensions page
- Update
backend/.env:ALLOWED_ORIGINS=http://localhost:3000,chrome-extension://YOUR_EXTENSION_ID
- Restart the backend server
This step is required for the extension to work. Follow these steps carefully:
-
Go to Notion Integrations
-
Click "+ New integration"
-
Fill in the details:
- Name:
Note Ninja - Associated workspace: Select your workspace
- Type: Select "Public" (NOT Internal)
⚠️ Important: You MUST select "Public" integration type to get OAuth credentials (Client ID & Secret). Internal integrations don't support OAuth. - Name:
-
Click "Submit"
After creating the integration:
- You'll see the "Internal Integration Secret" (starts with
secret_) - Click "Show" then "Copy"
- Paste this as
NOTION_API_KEYin yourbackend/.envfile:NOTION_API_KEY=secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
To allow users to connect their own Notion accounts:
-
In your integration settings, scroll to "Distribution"
-
Toggle "Public integration" to ON
-
Fill in the OAuth settings:
- Redirect URIs:
http://localhost:3000/auth/callback - Company name: Your name or company
- Website: Can be any URL (e.g.,
https://github.com/your-username) - Privacy policy URL: Can be any URL for development
- Terms of use URL: Can be any URL for development
- Redirect URIs:
-
Click "Save changes"
-
After saving, you'll see new OAuth credentials:
- OAuth client ID → Copy to
NOTION_CLIENT_ID - OAuth client secret → Copy to
NOTION_CLIENT_SECRET
- OAuth client ID → Copy to
-
Update your
backend/.env:NOTION_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NOTION_CLIENT_SECRET=secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx NOTION_REDIRECT_URI=http://localhost:3000/auth/callback
For the integration to write notes, you need to share a Notion database:
- Open Notion and create a new database (or use an existing one)
- Click the "..." menu in the top-right corner
- Click "Connections" → "Add connections"
- Search for and select "Note Ninja" (your integration)
- Click "Confirm"
⚠️ Important: The integration can ONLY access pages/databases that have been explicitly shared with it. If you get "object not found" errors, make sure the database is shared.
Your complete Notion configuration should look like:
# Notion API Configuration
NOTION_API_KEY=secret_abc123...
NOTION_CLIENT_ID=12345678-abcd-1234-efgh-123456789abc
NOTION_CLIENT_SECRET=secret_xyz789...
NOTION_REDIRECT_URI=http://localhost:3000/auth/callback-
Connect to Notion:
- Click the Note Ninja extension icon
- Click "Connect to Notion"
- Authorize the integration
-
Join a Google Meet:
- Start or join any Google Meet meeting
- Enable captions/transcripts in the meeting settings
-
Capture Notes:
- Note Ninja will automatically detect and capture the transcript
- You'll see a recording indicator on the Meet page
-
Export to Notion:
- When the meeting ends (or anytime during), click the extension icon
- Click "Export to Notion"
- Your formatted notes will appear in your Notion database
# Health check
curl http://localhost:3000/health
# Expected response:
{
"status": "OK",
"message": "Note Ninja Backend is running",
"timestamp": "2026-01-07T..."
}- Open any Google Meet link
- Check browser console for:
Note Ninja: Content script loaded - Click the extension icon
- Verify the popup displays correctly
Note-Ninja/
├── backend/ # Node.js + Express server
│ ├── routes/ # API endpoints
│ ├── services/ # Business logic
│ ├── controllers/ # Request handlers
│ ├── middlewares/ # Auth & rate limiting
│ ├── utils/ # Helper functions
│ ├── app.js # Express configuration
│ └── server.js # Server entry point
│
└── extension/ # Chrome Extension
├── manifest.json # Extension config
├── popup/ # Popup UI
├── content/ # Content scripts
├── background/ # Background worker
└── icons/ # Extension icons
Port 3000 already in use:
# Change port in backend/.env
PORT=3001Notion API errors:
- Verify your API key is correct
- Ensure your database is shared with the integration
- Check that your integration has proper permissions
Extension not loading:
- Make sure you selected the
extensionfolder, not the root folder - Check for errors in
chrome://extensions/ - Verify all required files exist
Can't capture transcript:
- Enable captions in Google Meet settings
- Check browser console for errors
- Refresh the Meet page after installing the extension
CORS errors:
- Add your extension ID to
ALLOWED_ORIGINSin.env - Restart the backend server
- Customize AI formatting - Edit
backend/services/ai.service.js - Add database support - Replace in-memory storage
- Enhance UI - Add React to extension popup
- Deploy backend - Use Heroku, Railway, or similar
- Publish extension - Submit to Chrome Web Store
- Check the README files in each folder
- Open an issue on GitHub
- Read the inline code comments
Made with ❤️ by the Note Ninja team
Happy note-taking! 🥷📝