Arcula is a privacy-focused identity and email management platform that lets you create and manage multiple anonymous email identities, securely store passwords, and keep your real identity safe across the web.
- Overview
- Features
- Architecture
- Tech Stack
- Getting Started
- Environment Variables
- Running Tests
- Project Structure
- Contributing
- License
Arcula allows you to create disposable email identities tied to specific websites so you never have to share your real email address. Emails sent to these aliases are accessible directly within the app. Passwords for each identity are stored using AES-256 encryption, and a Chrome extension auto-fills credentials and creates new identities on the fly.
- Anonymous Email Identities — Generate unique email aliases per website and protect your real identity.
- Email Inbox — Read emails delivered to your identities directly inside the app (via IMAP).
- Encrypted Password Storage — Store and retrieve site-specific passwords encrypted with AES-256.
- Chrome Extension — Auto-detects forms, suggests identities, auto-fills credentials, and lets you create identities without leaving the page.
- Mobile App — React Native app for managing identities on the go (iOS & Android).
- Account Verification — Email verification and password reset flows with secure tokenized links.
- JWT Authentication — Stateless, cookie-based sessions for the web app and extension.
The project is a monorepo with four main components:
arcula/
├── server/ # Node.js / Express REST API (TypeScript)
├── app/ # Next.js web application (JavaScript/React)
├── extension/ # Chrome extension (Manifest v3, JavaScript)
├── mobile/ # React Native mobile app (JavaScript)
└── mailserver/ # Mail server (git submodule)
The server exposes a REST API consumed by the web app, the Chrome extension, and the mobile app. It connects to a MongoDB database and uses IMAP to read emails for each identity's inbox.
| Layer | Technology |
|---|---|
| Backend | Node.js, Express, TypeScript, MongoDB (Mongoose) |
| Auth | JSON Web Tokens (JWT), bcrypt |
| Encryption | CryptoJS (AES-256) |
| Nodemailer, node-imap, mailparser, Handlebars templates | |
| Frontend | Next.js 12, React 17, SCSS/Sass |
| Chrome Extension | Manifest v3, Vanilla JavaScript |
| Mobile | React Native 0.67, Expo |
| Testing | Jest, Mocha, Chai, Supertest |
- Node.js ≥ 16
- npm ≥ 8
- MongoDB instance (local or cloud, e.g. MongoDB Atlas)
- An IMAP-enabled email account for hosting aliases (default domain:
altemail.co) - A Gmail account used to send verification and password-reset emails
cd server
npm installCreate a .env file (see Environment Variables), then:
# Development (hot-reload with nodemon) npm run dev # Production build npm run gcp-build # compiles TypeScript → dist/ npm start # runs dist/src/server.js
The server listens on port 5000 by default.
cd app npm install npm run dev # starts Next.js dev server on http://localhost:3000
For production:
npm run build npm start
- Open Chrome and go to
chrome://extensions/. - Enable Developer mode (toggle in the top-right corner).
- Click Load unpacked and select the
extension/directory.
The extension icon will appear in the Chrome toolbar.
cd mobile npm install npm run android # run on Android emulator / device npm run ios # run on iOS simulator / device npm start # start Metro bundler
Create a .env file inside the server/ directory:
PORT=5000 NODE_ENV=development # MongoDB MONGODB_URI=<your MongoDB connection string> MONGODB_TEST_URI=<your MongoDB test connection string> # Authentication JWT_KEY=<secret key for signing JWTs> # Encryption HASH_KEY=<AES encryption key> HASH_KEY2=<AES encryption secondary key> # Email (sending verification / password-reset emails) ARCULA_ACC_PASS=<Gmail app password for your verification email account>
For the frontend, create app/.env.local (development) or app/.env.production:
NEXT_PUBLIC_API_URL=http://localhost:5000
# Backend tests (Jest + Supertest) cd server npm test
arcula/
├── server/
│ ├── src/
│ │ ├── app.ts # Express app setup
│ │ ├── server.ts # Entry point & DB connection
│ │ ├── config/ # Environment configuration
│ │ ├── middleware/ # JWT auth middleware
│ │ ├── models/ # Mongoose schemas (User, Identity, Account, ...)
│ │ ├── routes/ # API routes (auth, identities, mail, verify)
│ │ ├── utils/ # Encryption, IMAP helpers, random generators
│ │ └── views/ # Handlebars email templates
│ └── tests/ # Jest test suites
│
├── app/
│ ├── pages/ # Next.js pages (index, login, register, home, inbox, ...)
│ ├── modules/ # Feature modules (Auth, Home, Inbox, Landing)
│ ├── components/ # Reusable UI components
│ ├── styles/ # SCSS stylesheets
│ └── utils/ # Axios client, React context, custom hooks
│
├── extension/
│ ├── manifest.json # Chrome extension manifest (v3)
│ ├── popup.html / login.html / settings.html
│ ├── scripts/ # Background service worker, content script, popup logic
│ ├── notifs/ # In-page notification iframes
│ └── styles/ # Extension stylesheets
│
└── mobile/
├── App.js # Root React Native component
├── android/ # Android native project
└── ios/ # iOS native project
Contributions, issues, and feature requests are welcome! Please open an issue or submit a pull request.
- Fork the repository.
- Create a feature branch:
git checkout -b feature/your-feature. - Commit your changes:
git commit -m "feat: add your feature". - Push to the branch:
git push origin feature/your-feature. - Open a pull request.
This project does not currently include a license file. Please contact the repository owner for usage permissions.