• Stars
    star
    1,292
  • Rank 36,420 (Top 0.8 %)
  • Language
    TypeScript
  • License
    GNU General Publi...
  • Created over 2 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Secure peer-to-peer chat that is serverless, decentralized, and ephemeral

Chitchatter

Chitchatter logo

Logo provided by @ramyashreeshetty

Chitchatter is a free (as in both price and freedom) communication tool. Designed to be the simplest way to connect with others privately and securely, it is:

  • Fully open source (licensed under GPL v2)
  • Peer-to-peer
    • Whenever possible, otherwise a TURN server is used to ensure reliable peer connection
  • End-to-end encrypted (via WebRTC)
  • Ephemeral
    • Message content is never persisted to disk on either the client or server
  • Decentralized
    • There is no API server. All that's required for Chitchatter to function is availability of GitHub for static assets, and public WebTorrent and STUN/TURN relay servers for establishing peer-to-peer communication.
  • Self-hostable

Chitchatter uses the Create React App toolchain. The secure networking and streaming magic would not be possible without Trystero. File transfer functionality is powered by secure-file-transfer.

How to use it

Open https://chitchatter.im/ and join a room to start chatting with anyone else who is in the room. By default, room names are random UUIDs that are generated client-side. To privately communicate with someone, it is recommended to join one of these randomly-generated rooms and share the URL (via the "πŸ”—" button at the top of the page) to whomever you wish to communicate with via a secure medium of your choosing (such as Burner Note or Yopass). Your user name will be presented to you, and it would be good to share that with who you will be chatting with beforehand so they know they're talking to you.

Features

  • Multiple peers per room (limited only by the number of peer connections your browser supports).
  • Public and private rooms.
  • Video and audio chatting.
  • Screen sharing.
  • File sharing:
    • Unlimited file size transfers.
    • Files are encrypted prior to sending and decrypted by the receiver (the key is the room name).
  • Markdown support via react-markdown.
    • Includes support for syntax highlighting of code.
  • Conversation backfilling from peers when a new participant joins.
  • Multiline message support (hold shift and press enter).
  • Dark and light themes.

Anti-features

  • Messages are never persisted to disk. When you leave a peer room, messages are cleared from memory and cannot be retrieved.
  • Chitchatter is an entirely client-side communication app. It uses public WebTorrent servers to establish peer connections and STUN/TURN relay servers when direct peer-to-peer connections cannot be established, but there is no Chitchatter API server.
  • No analytics, tracking, or telemetry of any kind.
  • This is a community-driven and unfunded project that makes no money. The users come first and there is no corporate influence or financial interest involved.

Why another chat app?

There is no shortage of user-friendly chat apps available, but they rely on a central service to facilitate communication. It is difficult to trust these central services, as commercial interests and government pressure can compel service operators to work against the best interest of the users. Even when when user data is handled in good faith by service operators, the possibility remains that encrypted data held at rest may be decrypted against the user's will.

Chitchatter designs around these risks with a web meshe architecture. There is no central service operator that stores or potentially mishandles communication data. Some services are required to establish an initial connection between peers, but otherwise the app uses direct peer-to-peer communication for everything. Any services that are used by Chitchatter have no association with the project and are publicly available for all to use.

Use cases

Chitchatter offers a private and secure solution for:

  • Organizing groups of people, such as unions or political movements
  • Conveniently moving text or data from one device to another
  • Video chatting with friends and family across operating systems (such as Android and iOS)
  • IT troublshooting via screen sharing
  • Livestreaming
  • Sharing sensitive information such as passwords
  • Much more!

Veracity

The core of Chitchatter's security model is the fact that it is fully open source. You are free (and encouraged) to fully audit the project source code and infrastructure. Not only is the source code available under the terms of the GPL, but all build logs are publicly accessible as well.

If you would like to verify that the app hosted at https://chitchatter.im/ is the one that is hosted on GitHub, you can use dig:

$ dig chitchatter.im

; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> chitchatter.im
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61332
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;chitchatter.im.                        IN      A

;; ANSWER SECTION:
chitchatter.im.         231     IN      CNAME   jeremyckahn.github.io.
jeremyckahn.github.io.  231     IN      A       185.199.111.153
jeremyckahn.github.io.  231     IN      A       185.199.110.153
jeremyckahn.github.io.  231     IN      A       185.199.109.153
jeremyckahn.github.io.  231     IN      A       185.199.108.153

To examine the static assets that are served to end users, you can audit the gh-pages branch.

Project roadmap

See the full ticket backlog here.

Environments

Available Scripts

In the project directory, you can run:

npm dev

Runs the entire stack (client + WebTorrent tracker) locally.

npm start

Runs the front end app in the development mode. Uses public WebTorrent trackers.
Open http://localhost:3000 to view it in your browser.

The page will reload when you make changes. You may also see any lint errors in the console.

npm test

Launches the test runner in the interactive watch mode. See the section about running tests for more information.

npm run build

Builds the app for production to the build folder. It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.

Self-hosting

Chitchatter is designed to be forked and self-hosted. If you would like to change pairing or relay server configuration, or you simply prefer to control your own builds and versions, just fork this repo and follow the steps below.

Caveats

Chitchatter peer connections are bound to the instance's domain. So, a user of Chitchatter at https://chitchatter.im/ would not be able to connect to a user of a Chitchatter instance on another domain (such as a personal GitHub Pages-hosted fork).

Necessary steps after forking

Assuming you are hosting Chitchatter on GitHub Pages:

  1. Change the homepage property in package.json to whatever URL your Chitchatter instance will be hosted from. This will be something like https://github_user_or_org_name.github.io/chitchatter/.
  2. Define a DEPLOY_KEY GitHub Action secret (at https://github.com/github_user_or_org_name/chitchatter/settings/secrets/actions). See the docs for peaceiris/actions-gh-pages for more information.

Deployment

On GitHub

When hosted on GitHub Pages and the configuration above has been done, the Production environment is updated when the remote main branch is updated (once GitHub Actions are enabled).

On non-GitHub hosts

Build the app with PUBLIC_URL="https://your-domain-here.com" npm run build, and then serve the build directory. Any static file serving solution should work provided it is using a secure context.

Runtime configuration

Explore the files in src/config to modify pairing and relay server configuration.

Troubleshooting

Peers won't connect

This could happen for a variety of reasons. The most likely of which is that one or more peers cannot connect directly and must use the configured STUN/TURN relay as a fallback. The standard relay is free and does not guarantee any level of service, so it may simply be unavailable for some time (or just not work at all for some users). There's not much to do other than wait until it becomes available again, or possibly try from another device or location.

Issues specific to browsers with ad blocking extensions

Some ad blockers (such as uBlock Origin) prevent connections to certain WebTorrent servers. This prevents Chitchatter peers from connecting. To work around this, you can either disable your ad blocker or self-host your own Chitchatter instance.

Issues specific to iOS Safari

Chitchatter works on iOS Safari, but browser-level bugs often prevent peers from rejoining the room when the browser is closed and later reopened (for instance, when switching applications). The suggested workaround for this issue is to refresh the page to rejoin the room.

Issues specific to Firefox

Per #36, check your about:config settings and ensure that media.peerconnection.enabled is enabled.

Contributors

⚠️ Disclaimer

By using Chitchatter, you agree to accept full responsibility for your actions related to its use. Additionally, you agree not to hold any contributors to the Chitchatter project responsible for any result of your use of it. The developers of Chitchatter do not endorse illegal activity.

More Repositories

1

shifty

The fastest TypeScript animation engine on the web
TypeScript
1,509
star
2

rekapi

A keyframe animation library for JavaScript
JavaScript
641
star
3

stylie

A graphical CSS3 animation tool
JavaScript
526
star
4

keydrown

A JavaScript key state handler for web apps
JavaScript
206
star
5

mantra

A professional web animation tool for everyone
JavaScript
181
star
6

lib-tmpl

A JavaScript library template.
JavaScript
125
star
7

farmhand

A resource management game that puts a farm in your hand
JavaScript
100
star
8

kapi

A keyframe API for the HTML5 Canvas.
JavaScript
62
star
9

dotfiles

This is what I use to get things done!
Vim Script
57
star
10

dragon

Another fn.draggable plugin for jQuery.
JavaScript
49
star
11

merkaba

An SVG editor component written in React
JavaScript
21
star
12

rekapi-timeline

A visual tool for modifying Rekapi animations
JavaScript
21
star
13

secure-file-transfer

A library to encrypt and transfer files P2P in the browser
TypeScript
19
star
14

vim-docker-env

A bare Vim environment, plus Pathogen, powered by Docker
Vim Script
15
star
15

rekapi-controls

Graphical controls for Rekapi animations.
JavaScript
10
star
16

props-editor

A UI for modifying React component props
JavaScript
8
star
17

misfit

A CLI UI for working with npm
JavaScript
8
star
18

Infinitely-Draggable-Content

Drag stuff around! For forever and ever!
JavaScript
8
star
19

js-project-starter

My personal starting point for JavaScript projects
JavaScript
6
star
20

Cachey

A caching plugin for jQuery
JavaScript
6
star
21

requirejs-lazy-load-example

An example of a lazy-loaded web app powered by RequireJS with a build process
JavaScript
6
star
22

require-and-backbone-views

An example of using Require.js and Backbone Views.
JavaScript
6
star
23

cubelet

A jQuery widget for graphically rotating a cube and working with its coordinates
JavaScript
5
star
24

tools

Some handy development tools
Vim Script
5
star
25

bezierizer

A graphical widget for defining a Bezier curve
JavaScript
4
star
26

storytime-with-github

Tell a story!
3
star
27

spinneroo

Take the web for a spin!
JavaScript
3
star
28

keyhandler_demo

A demonstration for a simple key handler in JavaScript
JavaScript
3
star
29

node-cli-boilerplate

Minimal, practical boilerplate for writing Node-powered CLI tools
JavaScript
3
star
30

rekapi-export-test

A test harness for experimenting with Rekapi exportTimeline data
JavaScript
3
star
31

tweetree

A fun project that lets you view random Twitter tweets in a visual tree.
JavaScript
3
star
32

jambi

A game development platform
2
star
33

transfornimate

A CSS transform animation tool
JavaScript
2
star
34

jumpjump

A game prototype for an idea I have.
JavaScript
2
star
35

fun-animal-names

Hash strings into fun animal names
TypeScript
2
star
36

jeremyckahn.com

My personal site.
CSS
2
star
37

wipe

An old jQuery plugin I made to make blur/wipe transitions
JavaScript
2
star
38

dumbdiff

It's a dumb, but fast and simple string differ for JavaScript.
JavaScript
2
star
39

hackday

We are hacking.
2
star
40

shifty-actors

A bridge library for Tweeny and Kapi actors.
JavaScript
2
star
41

jquery-canvas-kit

An old project, just throwing it on here because why not.
JavaScript
2
star
42

doodles

Sometimes I make art with code for fun.
JavaScript
2
star
43

farmhand-shuffle

A card game for farmers
TypeScript
2
star
44

jeremyckahn

It's a-me! jeremyckahn!
1
star
45

wrecked

An HTML5 game about rectangles. Hopefully it will be fun someday!
JavaScript
1
star
46

generator-web-project

This is the generator I use to start web projects.
JavaScript
1
star
47

trystero-node-sandbox

Sandbox repo for https://github.com/dmotz/trystero/issues/24
TypeScript
1
star
48

hackapi

Rekapi Art!
JavaScript
1
star
49

rekapi-benchmark

A simple performance benchmark for Rekapi, Underscore and Lo-Dash
JavaScript
1
star
50

rekapi-getting-started-demo

A runnable set of files for a Rekapi "Hello World"
1
star
51

vertigo

A jQuery plugin that makes a 3D UI for presenting content
JavaScript
1
star
52

petriEvolution

An old Processing project of mine.
Java
1
star
53

suggest-o-tron

An app that makes event suggestions for you
Ruby
1
star
54

rekapi-ios

An iOS-inspired Rekapi animation
JavaScript
1
star
55

3d-cards

A UI experiment with cards in 3D space
JavaScript
1
star
56

workflow-dispatch-test

A repo for experimenting with GitHub Actions
1
star
57

react-starter

My starting point for React apps
JavaScript
1
star
58

pwa-demo

TypeScript
1
star
59

jck-library-extensions

A set of extensions for open source libraries
JavaScript
1
star
60

iframe-test

HTML
1
star
61

jquerycanvaskit

Automatically exported from code.google.com/p/jquerycanvaskit
JavaScript
1
star