A modern, cross-platform chat app built with Expo, React Native, TypeScript, and a Node.js/Express backend in a monorepo structure.
Allo is a secure, universal chat platform designed for mobile and web with Signal Protocol encryption, device-first architecture, and peer-to-peer messaging. It features end-to-end encrypted messaging, offline support, and a clean, modern UI. Built with Expo, React Native, and a Node.js backend in a modern monorepo structure, it supports file-based routing, multi-language support, and a modern UI.
- 🔐 Signal Protocol Encryption - End-to-end encryption for all messages (even more secure than Signal)
- 📱 Device-First Architecture - Messages stored locally first, cloud is secondary
- ☁️ Optional Cloud Sync - Users can enable/disable cloud backup in settings
- 🔑 Automatic Key Management - Signal Protocol device keys generated and managed automatically
- 🚫 No Plaintext Storage - Server never sees unencrypted message content
- 🔒 Forward Secrecy - Each message uses a unique encryption key
- 🌐 Peer-to-Peer - Direct device-to-device messaging when both users are online
This is a monorepo using npm workspaces with the following structure:
/
├── packages/ # All code packages
│ ├── frontend/ # Expo React Native app (Allo)
│ │ ├── app/ # App entry, screens, and routing
│ │ │ ├── [username]/ # User profile, followers, following
│ │ │ ├── kaana/ # AI assistant or help section
│ │ │ ├── p/[id]/ # Post details, replies, quotes
│ │ │ └── ...
│ │ ├── components/ # UI components
│ │ ├── assets/ # Images, icons, fonts
│ │ ├── constants/ # App-wide constants
│ │ ├── context/ # React context providers
│ │ ├── features/ # Feature modules
│ │ ├── hooks/ # Custom React hooks
│ │ ├── interfaces/ # TypeScript interfaces
│ │ ├── lib/ # Library code
│ │ │ ├── signalProtocol.ts # Signal Protocol encryption
│ │ │ ├── offlineStorage.ts # Offline message storage
│ │ │ ├── p2pMessaging.ts # Peer-to-peer messaging
│ │ │ └── ...
│ │ ├── locales/ # i18n translation files
│ │ ├── scripts/ # Utility scripts
│ │ ├── stores/ # State management (Zustand)
│ │ │ ├── messagesStore.ts # Encrypted message store
│ │ │ ├── deviceKeysStore.ts # Device key management
│ │ │ └── ...
│ │ ├── styles/ # Global styles and colors
│ │ └── utils/ # Utility functions
│ ├── backend/ # Node.js/Express API server
│ │ ├── src/ # Backend source code
│ │ │ ├── controllers/ # API controllers
│ │ │ ├── middleware/ # Express middleware
│ │ │ ├── models/ # MongoDB models
│ │ │ │ ├── Conversation.ts # Chat conversations
│ │ │ │ ├── Message.ts # Encrypted messages
│ │ │ │ ├── Device.ts # Signal Protocol device keys
│ │ │ │ └── ...
│ │ │ ├── routes/ # API routes
│ │ │ │ ├── conversations.ts # Conversation endpoints
│ │ │ │ ├── messages.ts # Message endpoints
│ │ │ │ ├── devices.ts # Device key management
│ │ │ │ └── ...
│ │ │ ├── scripts/ # Utility scripts
│ │ │ ├── sockets/ # WebSocket handlers
│ │ │ ├── types/ # TypeScript types
│ │ │ └── utils/ # Utility functions
│ │ └── ...
│ └── shared-types/ # Shared TypeScript types
│ ├── src/ # Type definitions
│ └── dist/ # Compiled types
├── package.json # Root package.json with workspaces
├── tsconfig.json # Root TypeScript config
└── ...
- Node.js 18+ and npm 8+
- MongoDB instance
- Expo CLI for mobile development
-
Clone the repository
git clone https://github.com/OxyHQ/Allo.git cd Allo -
Install all dependencies
npm run install:all
npm run dev# Frontend only
npm run dev:frontend
# Backend only
npm run dev:backendThe frontend is an Expo React Native app that can run on:
- Web:
npm run web(ornpm run dev:frontendthen press 'w') - iOS:
npm run ios(requires macOS and Xcode) - Android:
npm run android(requires Android Studio)
The backend runs on the development server with hot reload:
npm run dev:backendnpm run dev— Start all services in development modenpm run dev:frontend— Start frontend development servernpm run dev:backend— Start backend development servernpm run build— Build all packagesnpm run build:shared-types— Build shared types packagenpm run build:frontend— Build frontend for productionnpm run build:backend— Build backend for productionnpm run test— Run tests across all packagesnpm run lint— Lint all packagesnpm run clean— Clean all build artifactsnpm run install:all— Install dependencies for all packages
npm start— Start Expo development servernpm run android— Run on Android device/emulatornpm run ios— Run on iOS simulatornpm run web— Run in web browsernpm run build-web— Build static web outputnpm run lint— Lint codebasenpm run clean— Clean build artifacts
npm run dev— Start development server with hot reloadnpm run build— Build the projectnpm run start— Start production servernpm run lint— Lint codebasenpm run clean— Clean build artifactsnpm run migrate— Run database migrationsnpm run migrate:dev— Run database migrations in development
npm run build— Build TypeScript typesnpm run dev— Watch and rebuild typesnpm run clean— Clean build artifacts
All project documentation is available in the docs/ folder:
- Allo System Overview - Legacy system overview
- Allo Format Specification - Legacy format summary
- Allo Implementation - Legacy implementation details
- Notifications System - Notification system documentation
- Visual Guide - Visual design guide
- Theming Guide - Complete theming system documentation
- Theme Quick Reference - Quick reference for developers
- Theming Troubleshooting - Common theming issues and solutions
- Performance Optimizations - Performance best practices
- Vercel Deployment - Deployment guide for Vercel
- Code Cleanup Summary - Code cleanup documentation
The Allo API is a secure backend service built with Express.js and TypeScript, providing encrypted messaging functionality, device key management, authentication, and real-time communications. All messages are encrypted using Signal Protocol - the server never sees plaintext.
For detailed API information, see:
- Backend README - Complete API documentation
- Frontend README - Frontend implementation details
- Signal Protocol: End-to-end encryption using ECDH + AES-GCM
- Device-First: Messages stored locally, cloud sync is optional
- P2P Messaging: Direct device-to-device when available
- Key Exchange: Automatic device key registration and exchange
- Offline Support: Full functionality without internet connection
Contributions are welcome! Please open issues or pull requests for bug fixes, features, or improvements.
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests and linting:
npm run test && npm run lint - Submit a pull request
This project is licensed under the MIT License.