Pluma (Latin for "feather" or "pen") is a real-time collaborative documentation platform inspired by Google Docs. It uses modern web technologies to provide a seamless writing experience where multiple users can edit, and comment simultaneously.
-
Real-time Collaboration: Powered by Liveblocks and Lexical, allowing multiple users to edit the same document with live cursor tracking and presence indicators.
-
Access Control: * Invitations: Authors can invite collaborators via email.
-
Role Management: Assign roles as Editor (full edit rights) or Viewer (read-only).
-
Collaborator Removal: Owners maintain full control over the access list.
-
Live Notifications: Stay updated when you are mentioned in a comment or granted access to a new document.
-
Responsive Rich Text Editor: A floating toolbar and optimized editor interface built for both desktop and mobile productivity.
Pluma is built with a focus on type safety, scalability, and developer experience:
- Framework: Next.js (App Router & Server Actions)
- Editor Engine: Lexical (React-based rich text framework)
- Real-time Engine: Liveblocks (WebSockets, Presence, and Storage)
- Authentication: Clerk (Secure user management and auth)
- Monitoring: Sentry (Error tracking and performance monitoring)
- Styling: Tailwind CSS & Shadcn/UI
Logo taken from svgviewer
pnpm install
or
npm install
Create a .env.local file in the root directory and add the following keys from your respective providers:
# Clerk (Auth)
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
# Liveblocks (Real-time)
NEXT_PUBLIC_LIVEBLOCKS_PUBLIC_KEY=
LIVEBLOCKS_SECRET_KEY=
npm run dev
Open http://localhost:3000 with your browser to see the result.
Pluma follows a modular architecture to separate concerns between the collaborative engine and the UI:
/components: Reusable UI components (Modals, Headers, etc.)/lib/actions: Server Actions for document CRUD and permission logic./lib/liveblocks: Configuration for the real-time presence and storage./plugins: Custom Lexical plugins for the editor toolbar and floating menus.
