Git Product home page Git Product logo

emberclear's Introduction

emberclear is published at: https://emberclear.io and can be run locally with docker via

docker run -d -p 4201:80 nullvoxpopuli/emberclear

and then can be visited at http://localhost:4201.

Project Directory

Another Chat App?

Yes, there is a lack of trust that manifests when existing chat apps are closed source and centralized. Emberclear, by design, is trustless -- meaning that, while there is a server component, the server knows nothing more than your "public key". The server(s) are also meant to be a hot-swappable member of a mesh network, so no one implementation matters, as long as the same protocol is used.

Here is a table of detailing out some differences between emberclear and other chat apps:

Development

See: CONTRIBUTING.md

Special Thanks

  • Cross-Browser / Cross-Platform Testing and Automation

License

GNU General Public License version 3

emberclear's People

Contributors

amgassert avatar beyrerdn avatar brunoocasali avatar celticmajora avatar dependabot[bot] avatar ember-tomster avatar greenmobius avatar halawami avatar jahrock avatar lifeart avatar mend-bolt-for-github[bot] avatar nullvoxpopuli avatar renovate-bot avatar renovate[bot] avatar snyk-bot avatar zeusintuivo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

emberclear's Issues

List of features to consider

List of random thoughts after using emberclear:

  • Read receipts feature would be a good feature to have. It's really familiar to users from almost every chat app nowadays. I think it could be done if you listen browser's tab activity and don't mark the messages as read if the recipient's tab is not active. Show the "✔️" mark when the message is successfully sent/received on the server-side, and "✔️✔️" when it's actually read in the client-side (tab is active). Option for users to opt-out from this (so it shows only "✔️").
  • Open graph response feature and its privacy issues. If I want to send some URL to a contact, let's say like https://google.com, I don't want that my browser makes a http request to Google. Please make it so that the open graph data is served from the emberclear servers rather than the server where I linked to. Also the receiver will make a http call to the received URL to fetch the open graph data.
  • Make the chat UI look like how almost all modern chat UI's do, where the sender's messages are floating on the right with some color, and the recipient's messages are gray floating on the left side, like WhatsApp, Signal etc. And also keep the current "IRC like" styling, so a user can choose how the chat UI looks.
  • When the chat is opened, why is there are "Chat" link in the top right navigation bar?
  • Is adding a contact somewhat confusing right now? You can add a friend from the left sidebar "+" link, which is fine I think. But then the top-right corner dropdown has its own button "Add Friend", which seems odd. I would remove the button from the dropdown menu, and just show list of links (Contacts, Settings, <hr> Logout). Then in the Contacts page, I would display a button to add a contact. I think that would be more straightforwarded/coherent.
  • I wouldn't use two different words to convey the same information. Now "Contact" and "Friend" are both used to mean the same thing. Use only "contact"?
  • A feature where user can mute contacts.
  • A feature where user can turn on an "invisible mode" (so the online status is hidden) from the settings.
  • If there will be an emoji support in the future, make it so that the user can disable emojis from the settings.
  • "Last seen" feature. Should be done in a way users can opt-out from it.
  • The red unread number count tag in the left sidebar and the "x new messages since Nov 26, 01:26 AM | Mark all as read" notifiaction are sometimes bugging. Red unread tag won't disappear unless I switch to some other chat or other page like settings. And the notify message won't disappear even I send new messages to the contact, meaning I have to manually click the "Mark all as read".
  • A feature where a sound is played when a message/notification is received.
  • A feature where the title of the page is updated by the count of unread messages. So if my tab is inactive and a contact is sending me messages, title would update everytime I receive a new message from the chat I have open in the tab. So if I have 6 unread messages in the chat, title would be "(6) emberclear", and when I open the tab, title would go back to "emberclear".
  • A feature where you can sort the contacts list how you want.

Action required: Greenkeeper could not be activated 🚨

🚨 You need to enable Continuous Integration on Greenkeeper branches of this repository. 🚨

To enable Greenkeeper, you need to make sure that a commit status is reported on all branches. This is required by Greenkeeper because it uses your CI build statuses to figure out when to notify you about breaking changes.

Since we didn’t receive a CI status on the greenkeeper/initial branch, it’s possible that you don’t have CI set up yet. We recommend using Travis CI, but Greenkeeper will work with every other CI service as well.

If you have already set up a CI for this repository, you might need to check how it’s configured. Make sure it is set to run on all new branches. If you don’t want it to run on absolutely every branch, you can whitelist branches starting with greenkeeper/.

Once you have installed and configured CI on this repository correctly, you’ll need to re-trigger Greenkeeper’s initial pull request. To do this, please click the 'fix repo' button on account.greenkeeper.io.

Implement a 2-factor-auth-esque technique for transferring content between devices

PreReq: #58
Inspiration: https://gitlab.com/NullVoxPopuli/emberclear/issues/27

Plan:

  • Find State Machine Library
  • Design and implement Finite State Machine for the following Flow (which will cover the entirety of this feature)

The setup:

  • A user has a profile on a desktop computer (desktop)
  • they want to copy their profile to a new device (mobile)

The flow:

  • desktop: open settings

  • desktop: click "transfer to device"

    • QR Code appears containing only the public identity information
      • QR Code generated should have the public identity information as well as an additional keypair for extra encryption of the profile code, in case some nefarious party sends a "Request profile info" message.
        • the "request profile info" message must be encrypted using the generate one-time-use keypair.
        • the User should still have to manually match up a code to prevent people with cameras nearby from also trying to capture the profile information
  • mobile: click login

  • mobile: click scan

    • mobile scans the public identity information
    • a temporary pub/priv key pair are generated on the mobile device
    • the mobile device sends a specially formatted message to the desktop
    • the mobile device displays a 6 digit Hex Code
    • desktop opens a prompt containing the a hex code and asking to allow or deny the transfer and instructs the user that the hex codes on both devices must match before proceeding
  • desktop: click allow

    • desktop sends profile information in one message including contacts, channels, settings, etc to the mobile device over the p2p encrypted channel (the usual communication method)
    • mobile receives the profile information and settings and imports it
    • mobile logs the user in

The profile has successfully been transferred

Thoughts:

  • to prevent spam requests for transferring profiles, maybe there should be a way to block people
    • this would help with bad-actors in general

Invisible Status

A user should be able to set their status from online to invisible. This would mean that:

  • we do not reply to ping messages
  • we still send delivery confirmations
  • we would also send read receipts if those are implemented

This project needs a logo!

I've sort of hacked a logo over at: https://github.com/NullVoxPopuli/emberclear/tree/master/images
But, I'm not a designer.

What we should have is something, simple, and abstract-ish, but still somewhat representative of the ideas behind this project.

  • this is a chat program, but eventually audio, video, and screen sharing may be possible, so text chat isn't the only way of communicating
  • everything is always encrypted between you and the recipient. no one can else can view a message.
  • this chat / tool may or may not be used for nefarious purposes, I don't care
  • eventually we'll use a mesh network for the relays (hence the lines and cicles in the current icon), which means that the backend-supporting infrastructure could never be taken down.
  • always open source <3
  • always free
  • this is kind of a peer-to-peer application, but it's really a peer-mesh-network-peer architecture

Maybe some inspiration:
The Ubuntu logo, The Circle of Friends
image
maybe this could be represent the invite-only nature

Network architectures:
image

Things that I'm not looking for:

  • lock imagery
  • chat bubbles
  • the same ideas in the current logo, but styled differently

I think these are too literal. like, encryption is almost always represented my keys, or locks, and network topology is almost always represented my connected dots layed out in different ways

In my googling, I thought this was an interesting representation of encryption: https://gdmissionsystems.com/-/media/General-Dynamics/Cyber-and-Electronic-Warfare-Systems/Images/GD-Embedded-Encryption-Hero-02-rev.ashx?h=1016&w=1788&la=en&hash=E86C435EB5EEF9CADDE9E2FC519E7C29
but it's way too complicated for a logo.

idk. logos are hard.

Allow a user to mute individual contacts

Messages will still be received, but

  • no notifications
  • muted contact is shoved to the bottom of the contact list
  • unread indicator is omitted from the overall sidebar unread pointers

Migrate the frontend project from gitlab to this repo, and dismantle the monorepo

  • most development only happens on the frontend code.
  • the backend code is already a submodule within this project.
  • GitHub has social coding figured out -- GitLab, even though more feature complete, feels less "friendly"

Pulling the frontend code out to this repository (instead of mirroring the gitlab repo here), will allow me to finally test out my mono-repo idea of actually not having everything in the same repo, but using sub-modules

TODO:

  • Get non-gitlab C.I. configured
    • Travis -- waiting on travis-ci.org -> .com migration
    • GitHub Actions -- not yet released
  • Setup deployment in new C.I. environment
  • Transfer Issues from GitLab
  • Disable GitLab C.I.
  • Work on updating the mesh-chat-protocol repo
    • Deprecate / mark abandoned the old clients / relays
    • Update the list of new clients (currently just emberclear)
    • Update the list of relays (currently just the pheonix relay)
    • Update the documentation / protocols
  • Mirror back to GitLab for safety
  • Setup bi-directional mirror between github and gitlab
    • this will allow for people comfortable with either to submit pull requests
  • Make the frontend project in the root of the repository

Switching to a long chat makes browser lag

If there's a chat which chat log is fairly long, activating the chat will lag the browser for a second. Maybe show only last 50 messages and show the rest if scrolled up or something?

Investigate switching from showdown to marked

Estimated Time:

  • Research: 2-8 hours
  • Implementation: 8-16 hours

Description
Investigate if it's worth switching to Marked, and if all the functionality from showdown is present.
Also evaluate how good of a library Marked is compared with showdown, update frequency, popularity, etc.

Notes
Marked: https://bundlephobia.com/[email protected]
Showdown: https://bundlephobia.com/[email protected]

it's about 14kb in savings to switch to marked.
But, is all the functionality there?

Swap out Bulma for some other css framework so that themes can be supported

... specifically a dark theme.

Requirements:

  • must use css variables to take advantage of native browser support for dynamic themes.

Research:

  • Biomatic - SASS - ✔️ - no english documentation, but uses css vars
  • Bulma - SASS - No css variables
  • Chota - CSS - ✔️ does not have many components
  • Flat Remix - CSS - No variables
  • Frow CSS - SASS - No css variables
  • Katana - SASS - just layout
  • MUI - SASS - No css variables
  • Mustard UI - SASS - No css variables
  • Paper CSS - SASS - No css variables
  • Pure - CSS - No variables
  • Shoelace - CSS - ✔️
  • Spectre - SASS - No css variables
  • Tailwind - very flexible, somewhat different from css

Notes:
Would use on a non-themeable project: Bulma and Frow

Interesting other things found:
https://trianglify.io/ - makes neat backgrounds

Pin chats in the sidebar

Estimated Time: 8-24 hours

Description

There should some way to pin a chat to the sidebar.
When pinned, it'll show at the top of the list (but still below you), and not hide when "hide offline contacts" is checked.

There will need to be a UI/UX exploration for this, as real estate in the sidebar is very limited.

Sub components under MU

Hi. Would very much like to know how you could achieve components under components, like;
chat-history -> message -> embedded-resource.

Have been trying this but I got "cannot find component".

Thanks.

Action required: Greenkeeper could not be activated 🚨

🚨 You need to enable Continuous Integration on Greenkeeper branches of this repository. 🚨

To enable Greenkeeper, you need to make sure that a commit status is reported on all branches. This is required by Greenkeeper because it uses your CI build statuses to figure out when to notify you about breaking changes.

Since we didn’t receive a CI status on the greenkeeper/initial branch, it’s possible that you don’t have CI set up yet. We recommend using Travis CI, but Greenkeeper will work with every other CI service as well.

If you have already set up a CI for this repository, you might need to check how it’s configured. Make sure it is set to run on all new branches. If you don’t want it to run on absolutely every branch, you can whitelist branches starting with greenkeeper/.

Once you have installed and configured CI on this repository correctly, you’ll need to re-trigger Greenkeeper’s initial pull request. To do this, please click the 'fix repo' button on account.greenkeeper.io.

Read Receipts

Currently, ✔️ is used for successfully sent.
✔️✔️ could be used when the message is read.

of course there should be an option to disable read receipts

Error in chat: An error occurred in the socket connection!

So, I just added a friend as a contact. Upon the contact being added an error appeared saying the error message I put in the title. I have attached a screenshot to show you. I can not send messages either. Is their anything specific in the browser that needs to be enabled? I use this hardened user.js for Firefox, and I also use DNSCrypt.
Note: I have whitelisted this site from uBlock Origin and Canvas Blocker (if that makes any difference).
(I hope I included any necessary information.)

screenshot from 2018-11-17 02-06-37

When submitting a code snippet with a language that has already been used, the code snippet is not colored.

image

This is because when the second code snippet is parsed, it detects the ts, and ts has already been loaded, so... why load it again?

what needs to happen is Prism.highlightAll() or whatever the equivalent would be for a specific language. (if it's possible to just highlight for the most recently submitted code snippet, that should happen).

Prism documentation: https://prismjs.com/extending.html#api

It actually looks like Prism.highlightAllUnder(element, async, callback) should be used in message/component.ts in the didInsertElement hook

Implement Channels / Rooms

Ideas:

This iteration includes:

  • some messaging refactors to support a more robust message passing system

    • see: the message.ts model
  • support for exclusive party / non-password-protected channels.

    • admission is only from someone already in a channel

      • this isn't intended be a security constraint, but should be something to be aware of
      • if someone could guess the channel info, they could add themselves?
        • this may be a bit naiive, but there should be a way to prevent this that is probably related to how the members lists are synced between members
    • password-protected channels would mostly function the same, but have that additional layer of security, that is hopefully shared in person

  • not included in this PR, but should channels have their own protocol for handling member additions / removals?

    • if there is intent to add a person, broadcast that intent to the channel.
      • if the inviter goes offline, everyone else in the channel is now aware of the invite
        • will need messaging if none of the members are online. "invite cannot be accepted until a member of the channel is online"
      • if the invited never accepts, that invite should expire on everyone's machines
        • the invited should also receive a message saying that the invite expired
        • an invite expiring shouldn't need to be sync'd
    • if there is intent to remove a person, and the remover is not the person who created the channel, require a majority vote to remove the person. This person is removed from everyone's member list for the channel and blacklisted.
      • blacklisting means that while someone can still try to send the channel messages, their client will let them know that they've been banned, and no messages that person hacks into the client to send will be rendered by the receiving clients

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.