e2ee 2-way Contact Form

e2ee 2-way Contact Form

An end-to-end encrypted chat application that allows you to offer a public contact point (similar to email) while communication remains anonymous. Does not require revealing of personal details. Use as stand-alone, or embed in web pages.

March 12, 2023· 4 min read
132 score

Project Overview

I am building an end-to-end encrypted kind of chat application that aims to give you a convenient method with which you can offer your contact information to the public but still communicate anonymously while maximizing privacy for all involved parties.

It can be used as an alternative to email and to messaging apps that require you to reveal your phone number.

See Features for details.

It's already functional and I have it running for myself, but visually it's not very sophisticated yet.

This project builds on the principle of "Can't be evil".

The project's working title is simply "Contact Form".

I want to use this page to post updates on the project's progress and allow you to follow along.
Discussion about features and other related topics is highly appreciated.

A Log is at the bottom of the page.

Highlights

You can host it yourself and you can easily piggyback non-technical people to make use of the Contact Form themselves and spread the use of private communication.

Completely web-based and anonymous:
Access through browser with username/password.

The username/password combination makes a user's identity.
Users log in again to see your reply and to continue the conversation.

The front-end application leaves no trace on the device.
This is good in case your device ever gets compromised.
No cookies whatsoever are used, and neither keys nor messages are stored on the device.
The entire session lives in-memory.
Once the page is closed or refreshed, the session is gone immediately.

Entry points:
Each entry point has its own URL.
Create as many entry points as you like and decide which entry point you reveal to whom.
Delete entry points to quickly cut off spam or unwanted visitors.
Kind of like email aliases or throw-away addresses.

More is in the making.
See Planned Features for more.

Background

Contact forms are great because communication is encrypted through https.
Which means the encryption is available in every browser "for free" and users don't need any technical understanding.
However, common contact forms only work in one direction and follow-up communications are via email.
And email is terrible for privacy.

How do you establish a communication channel with people you met in a public place where everybody is listening?
Exchanging email addresses works but is not private.
Exchanging phone numbers may be too personal to start with.

Similar situation when you want to offer your public contact information like on a website or on a business card.
A contact form on your website is good because it uses SSL encryption but it is only one-way and you typically have to reply through email.

Features

Current

  • entry points - Each entry point has its own URL. Use to separate visitors by e.g. topic and to quickly cut off unwanted visitors without nuking your entire network.
  • piggyback other users - Create "tenants" for other people so they can have their own contact form but hosted on your instance.
    • particularly good to onboard non-technical people and bring encrypted communication to them
    • also good if someone doesn't want to maintain their own web server
    • works via script on the server (not available in the GUI)
  • sending files
  • communication between tenant and instance owner
  • embeddable via iframe
    • basic styling options via query parameters
  • optimizations to save bandwidth

Planned

(May contain unfinished ideas)

  • instance-to-instance communication
    • chat-style and email-style
  • define required fields that visitors have to fill in before they can start a conversation (like an actual contact form)
  • restrict login at admin entry point to admin
  • more sophisticated styling options when embedding
  • as admin/owner: filter conversations by entry point
  • deletion of conversations (currently only possible to delete entire entry points)
  • RSS/Atom feed for notifications
  • chat client as browser extension
  • make pretty

Technical stuff

  • NodeJS on the server
  • VueJS on the client
  • Encryption through sodium-plus library (based on libsodium) on both server and client

Source code

Available on GitHub at https://github.com/IgiPikek/contact-form.

Log

  • 2023-10-29 - Added basic responsive UI layout to admin view.
  • 2023-10-28 - 'Refresh messages' now uses the opposite party's last message as reference. This avoids missing messages that arrive between the last refresh and your subsequent outgoing message.
  • 2023-07-06 - Added some feedback messages to UI.
  • 2023-05-23 - Embedded mode via query param. Define styling via query params when embedding in iframe.
  • 2023-05-14 - Large messages are no longer downloaded immediately. Instead, the user has to explicitly press a button to download.
  • 2023-04-27 - Published code on GitHub
  • 2023-04-18 - Fixed a bug that prevented the refreshing of the conversation after sending a message.
  • 2023-04-11 - Fixed bug from 2023-04-04
  • 2023-04-04 - Identified a bug that prevents first-time visitors from starting a conversation. Fix gets top priority.
  • 2023-04-02 - Working on bandwidth optimization. Don't download large files/messages immediately but display placeholder with file size and download button.

Related Articles