Zelta has now stopped all native servers. You can deploy your own servers using the codebase. Scroll down to the bottom for link to the repository.
- Stable version 1.0 (Code Blue) is live!
- Security : A key id pool was used to communicate the key value to the server for signing jwt or encrypting messages during beta. This could pose a security threat because of the finite number of key ids in the pool. In this version a new key as well as a unique key id is generated for each use. The server runs a cron job to regularly purge used keys in the database to free up space.
- New features : Encrypted Live Chat, Server Regions
Zelta is an open source, secure, anonymous and feature rich messaging service for the terminal.
Security & Encryption (High Level Overview)
- Zelta does not collect any personal information.
- Zelta does not log your ip address nor does it store cookies and trackers.
- Your messages are only stored until you see them. Once you view them, all records of their existence are completely erased. So do remember to screenshot important messages.
- User passwords and group passphrases are converted to salted hashes before they are stored in the database.
- The database server hardware encrypts all data at rest.
- Messages are encrypted using AES-256 with rotating cryptographic keys produced by the application server.
- All sensitive communication is carried out using signed json web tokens over tls.
- Zelta Chat provides real time end to end encrypted group chat.
Node JS (v8 and above)
npm i -g zelta
yarn global add zelta
Display a list of all the available commands
Register a new username
$ zelta register
Login. Once you login, the access token is valid for 24 hrs. You should logout after each session on an untrusted device.
$ zelta login
Send a message
$ zelta send
Create a group. There are two types of groups in zelta : public and private. Anyone can join a public group using the passphrase but private groups require an invite to join. The invitation is sent by the admin, who is the creator of the group. Currently the group limit is 50 members.
$ zelta group
Join a public group using the passphrase. Group names are referred to using the @ symbol.
$ zelta join <group>
If you try joining a private group, zelta mentions that you need an invite.
Invite a user to your group (admin privilege). Use @ for mentioning group name.
$ zelta invite <user> <group>
Accept a group invite. You will receive the invite in your inbox.
$ zelta accept-invite <group>
To send messages to a group, just address the message to a group name using @. Needless to say, you need to be a member or admin of the group. Remember that @ tells zelta that you intend to send the message to a group. Without @ the message may be sent to a user with the same username as the group name.
You can always change the access level of your groups (admin privilege)
$ zelta set-public <group>
$ zelta set-private <group>
List all the members of a group. Needless to say, you need to be a member yourself.
$ zelta members <group>
Leave a group. If you are the admin, the oldest member of the group becomes the new admin.
$ zelta leave <group>
Kick a group member (admin privilege)
$ zelta kick <user> <group>
Check your messages using the inbox command. Group messages appear in a user@group format. The time shown is GMT unless you have configured your local timezone.
$ zelta inbox
Configure your local timezone using the timezone configuration wizard. For your security and anonymity, this info is not sent to the server. You will have to re-configure your timezone each time you are on a new device or each time you perform a fresh install. If you dont do this all incoming messages will show the GMT time.
$ zelta timezone
Create a chatroom
$ zelta chatroom
Zelta can support multiple chat servers in diffrent regions.
$ zelta region <region>
When you use the
chatroom command, a chatroom is created on that server. The room name must be unique for the server. The creator of the room is the room owner and reserves the right to destroy the room. Until the room is destroyed, it will be live for any participant with the room name and passphrase.
- Passphrase : Must have a minimum length of 8
- Encryption : There are two choices for end to end encryption : Rabbit and AES
You can enable
typing-effect to have incoming chat messages typed on your screen (matrix style!). This may not work on every terminal and currently doesnt support emojis. It is not recommended to use it in busy rooms as the animation can create a backlog of messages.
$ zelta typing-effect <value>
Head over to a chatroom to see if it works
Customize the typing speed by setting the delay (in ms) between the printing of each character. Use the
typing-delay command. Recommended value is between 100 - 130. Default is 115.
$ zelta typing-delay 120
Join a chatroom
$ zelta chat
You will need to be connected to the same chat server as the chatroom and you must know the room name and passphrase. Currently there is no invitation system implemented into chat. But you may manually invite the person through a personal message (Refer :
Madbot is the chat moderator. It recognizes these commands:
members: List all the members in the room
leave: Exit the chat
mad facts: Bot tells you a random fact picked from wikipedia
destroy: Only takes effect when used by the room creator. Destroys the room and releases the room name. Gives a 30 second headstart.
If you have not used the
timezone command to configure your local timezone, UTC/GMT time is shown by default.
For emojis you can use an OS provided emoji panel or use the following syntax -
:emoji_name: Example -
:smile: This will render as a smiley emoji for the receiver. Refer this list for emoji names : emoji-list
Logout. You should logout after each session on an untrusted device. If you dont logout, the access token expires in 24 hrs.
$ zelta logout
CREATED BY : ZAYGOZI
Linkedin | Github
Show me the code