https://github.com/jonathas/realtime-notes-pad
A self-hosted real-time collaborative note-taking app built with React, FastAPI, and WebSockets. Inspired by Google Docs, but designed for privacy-first local networks.
https://github.com/jonathas/realtime-notes-pad
Last synced: about 1 year ago
JSON representation
A self-hosted real-time collaborative note-taking app built with React, FastAPI, and WebSockets. Inspired by Google Docs, but designed for privacy-first local networks.
- Host: GitHub
- URL: https://github.com/jonathas/realtime-notes-pad
- Owner: jonathas
- License: mit
- Created: 2025-07-06T15:15:35.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-07-06T15:51:41.000Z (about 1 year ago)
- Last Synced: 2025-07-06T16:30:02.998Z (about 1 year ago)
- Language: TypeScript
- Homepage:
- Size: 558 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ๐ Real-Time Notes Pad (WIP)
A **self-hosted** real-time collaborative note-taking app built with **React**, **FastAPI**, and **WebSockets**. Inspired by Google Docs, but designed for privacy-first local networks.
Perfect for families, small teams, and privacy-conscious users who want to keep their notes completely under their control.

## ๐ Data Flow
```mermaid
sequenceDiagram
participant U1 as User 1
(Desktop)
participant U2 as User 2
(Mobile)
participant WS as WebSocket
Manager
participant API as FastAPI Server
participant DB as SQLite
Database
Note over U1,U2: Real-time Collaboration
U1->>WS: Edit note content
WS->>API: Process change
API->>DB: Save to database
API->>WS: Broadcast change
WS-->>U2: Live update
Note over U1,U2: Metadata Updates
U2->>API: Change note title
API->>DB: Update metadata
API-->>U1: Title updated
Note over API,DB: All data stays local
```
### Real-Time vs REST API
- **๐ก WebSocket**: Real-time content changes, cursors, typing indicators
- **๐ REST API**: Initial load, metadata (title, tags), note management
- **๐พ Database**: Single source of truth for all data
## ๐ Self-Hosted Architecture
- ๐ **Raspberry Pi friendly**: Runs efficiently on ARM devices
- ๐ **Privacy-first**: Your notes never leave your network
- ๐ **Multi-platform**: Web, desktop, and mobile apps
- ๐ฑ **Local network**: Fast, low-latency collaboration
- ๐พ **SQLite database**: Simple, reliable, zero-config storage
---
## ๐ Features
- [x] Real-time collaborative editing via WebSocket
- [x] Firebase Authentication (works with self-hosted setup)
- [x] Auto-saving with intelligent debouncing
- [x] Multiple notes management
- [x] Cross-platform clients (Web, Desktop, Mobile)
- [x] Simple backup (single SQLite file)
- [x] Docker deployment
- [ ] Electron desktop app
- [ ] React Native mobile app
---
## ๐ฆ Tech Stack
### Backend (Self-Hosted Server)
- **FastAPI** (Python) - High-performance API
- **SQLite** - Lightweight, serverless database
- **WebSocket** - Real-time communication
- **Firebase Auth** - User management
### Frontend (Multi-Platform)
- **React + TypeScript** - Web application
- **Tailwind CSS** - Styling
- **Electron** - Desktop wrapper
- **React Native** - Mobile apps (planned)
### Deployment
- **Docker** - Containerized deployment
- **Docker Compose** - Single-command setup
---
## ๐ Quick Start
### Option 1: Docker (Recommended)
```bash
# Clone the repository
git clone https://github.com/jonathas/realtime-notes-pad.git
cd realtime-notes-pad
# Start with Docker Compose
docker-compose up -d
# Access your notes at http://localhost:8000
```
### Option 2: Manual Setup
```bash
# 1. Start the backend
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
fastapi dev app/main.py
# 2. Start the frontend
cd frontend
npm i
npm run dev
```
### Option 3: Desktop App (Electron)
```bash
# Clone and setup
git clone https://github.com/jonathas/realtime-notes-pad.git
cd realtime-notes-pad
# Install frontend dependencies
cd frontend
npm install
# Run in development mode (starts both web server and Electron)
npm run electron-dev
# Build for production
npm run build-electron
# Create distributable packages
npm run dist
```
---
## ๐งช Testing
### Backend API Tests
The backend includes comprehensive tests covering:
- **Unit tests** - NoteService business logic
- **API tests** - REST endpoints
- **WebSocket tests** - Real-time functionality
```bash
# Navigate to backend directory
cd backend
# Run all tests
pytest
# Run with verbose output
pytest -v
# Run specific test categories
pytest -v -m "not slow" # Skip performance tests
pytest -v -m "slow" # Only performance tests
pytest -v -k "websocket" # Only WebSocket tests
# Run with coverage report
pytest --cov=app --cov-report=html
```
**Test Categories:**
- ๐ง **Unit Tests**: Core business logic (NoteService)
- ๐ **API Tests**: REST endpoint validation
- ๐ก **WebSocket Tests**: Real-time communication
All tests use isolated in-memory databases for fast, reliable testing.
---
## ๐ Project Structure
```bash
realtime-notes-pad/
โโโ frontend/ # React web application
โ โโโ src/
โ โ โโโ components/
โ โ โ โโโ Editor/ # Real-time text editor
โ โ โ โโโ Toolbar/ # Navigation and controls
โ โ โ โโโ Modals/ # Settings and note selection
โ โ โโโ services/
โ โ โ โโโ storage.ts # API client
โ โ โ โโโ firebase.ts # Authentication
โ โ โ โโโ websocket.ts # Real-time communication
โ โ โโโ hooks/ # React hooks
โ โโโ electron/ # Desktop app wrapper
โ โ โโโ main.js # Electron main process
โ โโโ public/
โ โโโ package.json
โโโ backend/ # FastAPI server
โ โโโ app/
โ โ โโโ routers/ # API endpoints
โ โ โโโ services/ # Business logic
โ โ โโโ models/ # Database models
โ โ โโโ auth/ # Authentication
โ โโโ tests/ # Comprehensive test suite
โ โ โโโ test_note_service.py # Unit tests
โ โ โโโ test_notes_api.py # API tests
โ โ โโโ test_websockets.py # WebSocket tests
โ โโโ data/ # SQLite database
โ โโโ requirements.txt
โโโ docker-compose.yml # Development setup
โโโ README.md
```
---
## ๐ Client Applications
### Web App
- Access via any modern browser
- Works on desktop and mobile
- Real-time collaboration
### ๐ฅ๏ธ Desktop App (Electron) - โ ๏ธ Work in Progress
A native desktop wrapper for the web app with enhanced features.

#### โ ๏ธ Current Status: Not Ready for Production
The Electron app is currently **under development** and missing critical authentication features:
- โ **Firebase Authentication**: Google sign-in doesn't work properly in Electron
- โ **OAuth Flow**: Browser-based auth redirects don't return to the app
- โ **Custom Protocol Handler**: Not yet implemented for auth callbacks
**Built Apps Location:**
- **Development**: Runs from `http://localhost:5173`
- **Production**: Packaged in `dist-electron/` folder
**Planned Features:**
- ๐ฅ๏ธ **Native window**: Proper desktop integration
- ๐ฑ **Cross-platform**: Windows, macOS, and Linux
- ๐ **Embedded auth**: In-app Google authentication
- ๐ **Auto-updater ready**: Built-in update mechanism
**For now, please use the web app** at `http://localhost:8000` which has full authentication support.
### ๐ PWA Features (Connection-Required)
This app is designed as a **connected-only** PWA that requires real-time WebSocket connection:
- ๐ฑ **App-like experience**: Installs like a native app
- ๐ **Fast loading**: Static assets cached locally
- ๐ **Smart reconnection**: Automatically reconnects when server available
- ๐ก **Connection awareness**: Shows connection status and graceful degradation
- ๐พ **No offline storage**: Notes require server connection (by design)
#### Why No Offline Mode?
- Real-time collaboration requires active connections
- Notes are stored securely on your self-hosted server
- Prevents sync conflicts and data loss
- Simpler architecture and better security
### Mobile Apps (Planned)
- React Native for iOS/Android
---
## ๐ง Configuration
### Environment Variables
```bash
# Frontend (.env)
# Firebase Configuration
VITE_FIREBASE_API_KEY=your_api_key_here
VITE_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your-project-id
VITE_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=123456789
VITE_FIREBASE_APP_ID=1:123456789:web:abcdef123456
# API Configuration
VITE_API_URL=http://localhost:8000
```
---
## ๐ Privacy & Security
### Data Privacy
- โ
**Local storage**: Notes never leave your network
- โ
**No cloud dependencies**: Works completely offline
- โ
**Your data, your control**: Easy backups and migrations
- โ
**Firebase auth only**: User accounts, not note data
### Security Features
- ๐ **JWT authentication**: Secure user sessions
- ๐ก๏ธ **CORS protection**: Configurable origins
- ๐ **Automatic backups**: SQLite file copying
- ๐ซ **No telemetry**: No tracking or analytics
---
## ๐ Backup & Restore
### Backup Your Notes
```bash
# Simple file copy
cp data/notes.db backups/notes-$(date +%Y%m%d).db
```
### Restore from Backup
```bash
# Stop the service
docker-compose down
# Restore database
cp backups/notes-20240105.db data/notes.db
# Restart
docker-compose up -d
```
---
## ๐ค Use Cases
### Perfect For
- ๐จโ๐ฉโ๐งโ๐ฆ **Families**: Shared grocery lists, vacation planning
- ๐ข **Small teams**: Meeting notes, project planning
- ๐ **Privacy-conscious users**: Keep sensitive notes local
- ๐ **Home labs**: Self-hosted enthusiasts
- ๐ **Students**: Collaborative study notes
- โ๏ธ **Writers**: Draft sharing and feedback
### Why Self-Hosted?
- **No subscription fees** - One-time setup
- **Complete privacy** - Your data stays home
- **Fast performance** - Local network speed
- **Works offline** - No internet required
- **Customizable** - Modify to fit your needs
---
### Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. **Run tests**: `cd backend && pytest`
5. Test on Raspberry Pi if possible
6. Submit a pull request
---
## ๐ License
MIT ยฉ Jonathas Ribeiro
**Built for self-hosters, by self-hosters** ๐