Giter Club home page Giter Club logo

threema-web's Introduction

Threema Web

Build status License Docker Image

⚠️ Note: Threema Web is in maintenance mode while we are working on Threema for Desktop 2.0, which should resolve some of the long-standing issues we were having with Threema Web. We will still do regular maintenance and fix critical bugs, but for now there will be no major new features or non-critical bugfixes. See #996 for more details.

Threema Web is a web client for Threema, a privacy-focussed end-to-end encrypted mobile messenger hosted and developed in Switzerland. With Threema Web, you can use Threema on your Desktop without compromising security.

https://web.threema.ch/

Screenshot

Threema Web establishes a connection between Desktop and mobile device using WebRTC (Android) or encrypted WebSockets (iOS). Signaling and data is end-to-end encrypted with SaltyRTC.

For more information, see the Threema Cryptography Whitepaper.

Bug Reports and Feature Requests

If you find a bug in Threema Web, feel free to open an issue on GitHub. Please make sure that your bug report hasn’t already been filed by using the search function.

Note that Threema Web is in maintenance mode while we are working on a new solution that should resolve some of the long-standing issues we were having with Threema Web. We will still do regular maintenance and fix critical bugs, but for now there will be no major new features or non-critical bugfixes. See #996 for details.

Beta Testing

We may occasionally deploy experimental branches on https://web-beta.threema.ch which you are encouraged to test. If you encounter problems, please open an issue and include the experiment’s version number (e.g. 1.2.3-experiment-beta4).

Translating

If you want to help translate Threema Web to your language, please check out TRANSLATING.md!

Protocol

The protocol used to communicate between the Threema app and Threema Web is documented here.

Development

Threema Web is written using TypeScript and AngularJS 1. Dependencies are managed with npm. You currently need Node.js 18 to build Threema Web. (Note that Node.js is only a build dependency, the result is plain old client-side JavaScript.)

If your default NodeJS version is not 18, use nvm to install it:

nvm install
nvm use

Install development dependencies:

npm install

Run the dev server:

npm run devserver

Then open the URL in your browser:

firefox http://localhost:9966

(Note that this setup should not be used in production. To run Threema Web on a server, please follow the instructions at docs/self_hosting.md.)

Testing

To run unit tests:

npm run build:unittests && npm run testserver
firefox http://localhost:7777/tests/testsuite.html

To run UI tests:

npm run build  # Required for CSS to be rebuilt
npm run test:ui <browser>

For example:

npm run test:ui firefox
npm run test:ui chrome

You can also filter the test cases:

npm run test:ui firefox emoji

To run linting checks:

npm run lint

You can also install a pre-push hook to do the linting:

echo -e '#!/bin/sh\nnpm run lint' > .git/hooks/pre-push
chmod +x .git/hooks/pre-push

Configuration

The configuration of Threema Web can be tweaked in src/config.ts and src/userconfig.js / src/userconfig.overrides.js (see src/userconfig.overrides.js.example. The config variables are defined at build time, and the userconfig variables can be modified at runtime. Please refer to those files for documentation on what variables exist and how to configure them.

In the Docker image, all userconfig variables can be overridden using env variables. See docs/docker.md for more information.

Self Hosting

For instructions on how to host your own version of Threema Web, please refer to docs/self_hosting.md.

Contributing

Contributions to Threema Web are welcome! Please open a pull request with your proposed changes.

Security

Every Threema Web release will be tagged. The git tags are cryptographically signed using the following PGP key:

pub   rsa4096 2016-09-06 [SC] [expires: 2026-09-04]
      E7AD D991 4E26 0E8B 35DF  B506 65FD E935 573A CDA6
uid           Threema Signing Key <[email protected]>

The public key can be found on Keybase.

If you discover a security issue in Threema, please adhere to the coordinated vulnerability disclosure model. To be eligible for a bug bounty, please file a report on GObugfree (where all the details, including the bounty levels, are listed). If you’re not interested in the bug bounty program, you can contact us via Threema or by email; for contact details, see threema.ch/contact (section “Security”).

License

Threema Web license:

Threema Web.

Copyright © 2016-2023 Threema GmbH (https://threema.ch/).

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

For third party library licenses, see LICENSE-3RD-PARTY.txt.

threema-web's People

Contributors

bluec0re avatar chrisly-bear avatar das-g avatar dbrgn avatar dennisheer avatar dependabot[bot] avatar econic avatar flothinkspi avatar iasdeoupxe avatar indianadschones avatar janrei avatar jlnwntr avatar joelfischerr avatar jwanner83 avatar lgrahl avatar mamrehn avatar marcozehe avatar mic92 avatar natackx avatar octoate avatar ovalseven8 avatar pythonix avatar rugk avatar sillych avatar sirtyson avatar threema-danilo avatar threema-lenny avatar tomelfring avatar vortex852456 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  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

threema-web's Issues

Add sass-lint to improve scss style

In general the scss files are nice, but detail is inconstant.

Examples:

spaces behind comma or not
$material-grey: rgba(0, 0, 0, 0.54);
$material-card-shadow: 0px 2px 5px 0px rgba(0,0,0,0.16),0px 2px 5px 0px rgba(0,0,0,0.23);

hardcoded color (available as variable)
$bright-background-color: white;
#main {
    background-color: white;
}
  • Comment out code
  • empty selectors
  • 0px value vs. 0 without px.
  • one selector vs multiple per line
  • lowercase vs. uppercase hex colors
  • different comment style /* */ vs //

"increase power consumption"?

In the app and on https://threema.ch/en/threema-web e.g. you state:

Threema Web might increase power consumption while it is active. You can enable or disable it at any time.

When I am actively using the web client this is obvious, but does it also apply when I no web client is connected?
So when I have "web client" enabled in the options and some may be shown in the list (as they are persistent sessions I've saved with the password), but none of them is actually connected (all red), the Threema app should not use more power than if I toggle the switch off… Is this right?

Otherwise disabling the web client in the app would be cumbersome and it would render the beneifit of the persistent sessions, where you just enter a password an a GCM push wakes up the Threema app, useless. (as you'd have to activate the web client in the app anyway)

Stuck at 99%

I tried to connect with Firefox 51 and Srware Iron 55 (Google Chrome Fork) and both are stuck at 99% with Loading initial data...

I waited for about 3 minutes and nothing happened.

What is initial data?

Some Emoji are not displayed correctly

https://twitter.com/NerdingByDoing/status/832225568322097152

Sending the sun emoji from Android results in the following span:

> emojione.unicodeToImage('☀')
"<span class="e1 e1-2600" title=":sunny:"></span>"

On the other hand, sending the same emoji from iOS results in this span:

> emojione.unicodeToImage('☀️')
"<span class="e1 e1-2600-fe0f" title=":sunny:">☀️</span>"

The codepoint U+FE0F is the emoji variation selector: https://unicode-table.com/de/FE0F/. On the other hand, U+FE0E would be the text variation selector.

The sprites CSS generated by the emojione library does not contain the 2600-fe0f variant.

Unfortunately, it looks like emojione currently does not support these variants: joypixels/emojione#358

Development Server binds on OpenVPN interface

Hello,

I tried to run Threema-Web on a server (Ubuntu 16.04) on which a OpenVPN server runs, too and Threema binds to the tun0 interface (in my case 10.8.0.1) instead of localhost or the eth0 iface (in my case with the ip 192.168.1.0).
Maybe a option to determine which interface should be used, so you can select one which you want to use.

Delete whole chat

At the moment, it is possible to delete single messages with Threema Web.

The feature to delete a whole chat would be cool too.

Implement Ballot

Step 1: Make it possible to view and take part in polls (aka ballots aka surveys).

Step 2: Make it possible to create polls.

Needs protocol and app update.

Message input edit line is not automatically focused when clicking on a contact

When clicking on a contact in Threema Web, the message input edit line is not automatically focused (like it is in WhatsApp Web), thus forcing the user to move the mouse to the input edit line and clicking into it (which sucks usability-wise).
The expected behaviour is to be able to start typing right away after clicking on a contact.

Cannot pair when phone is on the same LAN as the browser

Hi,

just started testing Threema web. I cannot pair my phone with web.threema.ch while my phone is connected to the same LAN as my web browser (on a PC). While both devices are on the same network, after scanning the QR code a spinner will be added to the session list and spin forever. When the phone is on mobile data, pairing succeeds.

After pairing succeeded, when the phone gets reconnected to the LAN Threema Web detects that the connection is broken and closes the session. After returning the phone to mobile data the session is resurrected in the web browser.

FYI, I'm running a IPv4/IPv6 dual stack configuration with an IPv6 firewall in place. Android 6.

Please let me know whether you need more information. The Threema log file does not contain additional information beyond the messages I received while pairing was attempted.

Replace ng-repeat in conversation with custom directive

The ng-repeat directive might be the source of a lot of performance problems.

Replacing it with a custom directive would probably improve a lot.

The directive would then have methods to update the status of existing messages via message id.

Refs #20 and #39.

Question: Can one sniff which page is called?

Just a short question:
When I want to write a message to Alice, I have to open the page https://web.threema.ch/#/messenger/conversation/contact/THREEMA_ID_OF_ALICE.

Can people in the network see that I loaded that page? So they would know with which Threema IDs I communicate.

Question because for normal websites one can sniff which websites I visit even if I use HTTPS.
Did a short test and I couldn't sniff it for the Threema app, but I am not sure if I did everything correctly.
Can Threema see it?

Stuck at 60%

If connecting is stuck at 60%, this means that you WebRTC PeerConnection cannot be established. We're working on fixes, but it's a complex issue with many possible causes.

  • Do you use a modern browser?
  • Do you use a browser plugin that disables WebRTC?
  • Do you use an ad blocker that might also block WebRTC?
  • Are you behind a (corporate?) firewall that does deep packet inspection?

Please go to https://web.threema.ch/troubleshoot/ to see if any problem is detected.

When using Firefox, please try whether it works with Chrome/Chromium/Opera, since current versions of Firefox don't yet support TURN via TLS, which can cause the traffic to be blocked by some firewalls.

When it doesn't work in Chrome, try running the Threema Web in an anonymous window (Ctrl+Shift+n). If it works there, a plugin is blocking the connection.

If that does not help, a firewall might be the problem, especially if the issue occurs in a company network. We're actively working on a fix to circumvent the firewalls, but it might take a few more days until everything is properly set up and tested.

Keyboard shortcuts

Would be nice to be able to control the application by keyboard only. E.g. switching conversations by pressing a handy shortcut, like in slack via [ctrl]+[k]

Feature: message forwarding

We can simple forward a message or picture in the native Android/IOS app.
Is there a plan to implement this feature in the web client?

Session password does not work to reconnect

Steps to reproduce:

  1. Go to https://web.threema.ch
  2. Use a session password, I used MH:cp-+{_;2p*}=E
  3. Everything works fine so far
  4. Close session
  5. Try to reconnect with the same password
  6. Threema Web says I use the wrong password! ❌

For me, it worked with an easier password. Perhaps Threema has problems with special characters?

Show battery level

Show battery level in Threema Web. Warn if level is below a certain threshold.

Scrolling up sometimes fails

E.g. scrolling up does not work with the "home" key if conversation is scrolled all the way to the bottom.

I also heard reports that scrolling fails with a touchpad.

Most probably has to do with the angularjs-scroll-glue library.

Audio notification for new messages

At the moment, I only get notified about new messages when the desktop notification option is enabled.

However, it does not play any sound on my computer (Firefox 51.0.1; Ubuntu 16.04).
It would be great if Threema Web played a sound when you get a new message (and independent from desktop notification).

Of course it should be possible to enable/disable the sound notification.

Support (optional) yarn

npm is really slow and "cloneCurrentTree: sill cloneCurrentTree Finishing" takes forever.

Initial yarn (v0.20.3):
80s

rm node_modules and install again with lock and cache:
7s

npm initial (has no cache or lock):
7m 24s

Moving forward it would be interesting to pin all dependencys and be able to provide a fast setup process.

Cheat-sheet:
https://shift.infinite.red/npm-vs-yarn-cheat-sheet-8755b092e5cc

Please not: yarn currently doesn't work out-of-box with this repository.

Sent images not shown

When I drag an image file (PNG file in this case) onto a chat in Threema Web (a group chat in this case), it is sent to the chat and I can see it in the same chat on the phone, but it isn't shown inside Threema Web. There is just an empty message or just the caption for the image. Threema Web is used on Chrome 56.

Show SaltyRTC connection status

User story: As a Threema Web user I want to see how my Threema App and Web client are connected.

This includes:

  1. Either using a direct connection (LAN) or routing over the server (TURN).
  2. Whether my mobile data is used (fees or so…) or whether my LAN/WLAN is used.

It would be good to combine these two similar (but not exactly the same) pieces of information into one status symbol or so…
Number 1 is what security geeks or people experiencing reconnections/performance issues would like to see and 2 is what people in special situations (limited data plan, …) or people interested in this generally like to see.


Appended from #195:

User story: I, as a (heavy) Threema Web user, want to see what route the Threema Web connection uses (mobile data/WiFi, uses TURN?) in order to evaluate problems/slowness/security/high costs…

This helps to:

  • avoid high costs when users have limited mobile data plans
  • evaluate the security (TURN is probably not what I want to use)
  • find reasons for slowness ("ah, mobile data and TURN, …") or disconnections ("oh, just switched to TURN")
  • potentially debug things (when you can also see what TURN mode is used – in a submenu, of course)

Potential solution

Display an icon in the "Threema Web" panel in the Threema app showing a basic connection status. And maybe add a context item ("Connection details" or the like) where advanced users can see a more detailed status. (maybe even with connection duration or so)

Threema Web does not necessarily show number of unread messages

Steps to reproduce:

  1. Open https://web.threema.ch
  2. Write a message to i.e. ECHOECHO
  3. Switch to another (browser) tab immediately
  4. You can see that the tab's title has changed from Threema Web to Threema Web (1). However, because in this tab the chat with ECHOECHO is open, it will be marked as read. So, after about a second you read Threema Web again and you cannot see that you have unread messages. If the chat with ECHOECHO is not open, everything works as expected.

I am not sure if it's technically possible, but messages should only be marked as read when they are really read (in the sense of I look at the chat). Otherwise, I cannot see if I got any message.

Laggy UI

Threema Web is sometimes a bit laggy. I have got around 30 contacts and the UI sometimes is a bit slow.
I can especially see it when (fastly) opening the context menu of messages:

lagy

Personally I'd say in the beta (before the last RC) it was not so laggy…

Message forwarding

Possible approaches:

  • Show a "forward" entry in the context menu of a message
  • Enable drag&drop of messages to other conversations or contacts

Wrap the web application with Electron

Not sure about how many adjustments are needed for this, but definitely worth a try.

Advantages:

  • Native look & feel of Threema and better integration (system tray, etc.)
  • Security does not depend on TLS anymore (https://web.threema.ch)
  • Session reconnection much easier
    • Many people delete browser data on a regular basis -> Reconnection is not possible
  • Perhaps performance boost?

Edit: Electron has some major security problems.

Very high cpu load while using webclient

While using the web client, I have a very high CPU load, using both Google Chrome and Vivaldi (Chromium based). I have attached a screenshot of the chrome task manager:

threema_cpu

This issue hinders me from using the web client in a "normal-use scenario", keeping it open in a pinned tab.

Edit:
I use Ubuntu 16.10 on a Dell XPS 13 (9360)

Bad UI when sending files

I sent a video (mp4) to a contact and the UI is really bad here:
screenshot
Yeah, that's the video. 😆

I think some improvements are definitely needed here.

Moreover, when I send a file/video/etc. I can check the box "Send as a file". What does this mean?

npm nativefier with Threema Web - Can't send message

When using Threema Web over npm's nativefier, I can't send any messages over it.
Pressing on the send msg icon as well as pressing Enter on the keyboard won't send the typed message.
Sending files (also with a attached message) works on the other hand.
Nativefier wrapps web apps with the electron framework in an OS executable.

npm nativefier: https://github.com/jiahaog/nativefier
System: Linux 64bit

Steps to reproduce:

npm install nativefier -g
nativefier --name "Threema" "web.threema.ch"

Show/Hide Inactive Contacts

Add an option to enable/disable display of inactive contacts.

No app/protocol update is necessary, the flag is already sent with a contact.

Threema should provide more explicit error message for large messages

When I send a large message to another user, it does not work.
Probably Threema should show how large a message may be.

I get the following error message:
Screenshot

That's the text I sent:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. 

Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. 

Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. 

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. 

At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. 

Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

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.