VOID is a production-ready collaborative workspace platform inspired by Notion, built with a modern tech stack focusing on real-time collaboration. Experience seamless multi-user editing with real-time cursors, text selection, and presence indicators.
- Frontend: Next.js 13 (App Router), React, TypeScript, TailwindCSS
- Backend: Supabase, WebSockets, Drizzle ORM
- Real-time: Custom WebSocket implementation for cursors, selection, and presence
- Authentication: Custom auth flow with 2FA email invitations
- Payments: Stripe integration with customer portal
- Database: PostgreSQL with row-level security policies
- Real-time cursor tracking shows exactly where teammates are working
- Text selection visualization across multiple users
- Presence indicators show who's online and their current location
- Custom rich text editor with collaborative editing
- Row-level security policies with Supabase
- Custom authentication system
- Email-based 2FA for workspace invitations
- Optimistic UI updates for zero-lag feel
- Custom emoji picker for expressive communication
- Light/dark mode with system preference detection
- Trash functionality with restore options
- Responsive design works across all devices
- Stripe integration for subscription management
- Custom pricing plans with feature restrictions
- User-friendly payment portal
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ
โ Next.js 13 โโโโโโโค WebSocket โโโโโโโค Supabase โ
โ Frontend โ โ Server โ โ PostgreSQL โ
โ โ โ โ โ โ
โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โฒ
โ โ
โ โ
โผ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ โ โ
โ Stripe โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค Drizzle ORM โ
โ Payments โ โ Layer โ
โ โ โ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
Our custom WebSocket implementation handles differential synchronization between clients with minimal bandwidth usage and optimistic UI updates.
// Example of real-time cursor tracking implementation
const updateCursorPosition = useCallback(
throttle((position: CursorPosition) => {
if (!socket || !user) return;
// Send position only if it changed significantly
if (Math.abs(position.x - lastPosition.current.x) > 5 ||
Math.abs(position.y - lastPosition.current.y) > 5) {
socket.emit('cursor:update', {
position,
userId: user.id,
documentId: currentDocument.id
});
lastPosition.current = position;
}
}, 50),
[socket, user, currentDocument]
);Supabase RLS policies ensure users can only access authorized content:
-- Example of row-level security policy
CREATE POLICY "Users can only view their own documents" ON documents
FOR SELECT USING (
auth.uid() IN (
SELECT user_id FROM workspace_users
WHERE workspace_id = documents.workspace_id
)
);- Server Components for reduced client JS
- Selective hydration for interactive elements
- Chunked data loading with Suspense boundaries
- Efficient WebSocket message batching
- Node.js 18+
- PostgreSQL database
- Stripe account
-
Clone the repository
git clone https://github.com/yourusername/VOID.git cd VOID -
Install dependencies
npm install
-
Configure environment variables
cp .env.example .env.local # Fill in your environment variables -
Set up the database
npm run db:migrate
-
Start the development server
npm run dev
For detailed documentation on the architecture and implementation details:
# Run unit tests
npm run test
# Run end-to-end tests
npm run test:e2e
# Run integration tests
npm run test:integration- AI-powered content suggestions
- Real-time commenting system
- Advanced permissions and roles
- Custom templates marketplace
- Mobile applications
- API for third-party integrations
This project is licensed under the MIT License - see the LICENSE file for details.
- Vercel for hosting
- Supabase for database and authentication
- Stripe for payment processing
- The amazing open-source community for their tools and inspiration
Built with โค๏ธ by YourName