Giter Site home page Giter Site logo

chatwoot's Introduction

Chat dashboard dark mode

Chat dashboard


Chatwoot

Customer engagement suite, an open-source alternative to Intercom, Zendesk, Salesforce Service Cloud etc.

Deploy Deploy to DO

Maintainability CircleCI Badge Docker Pull Badge Docker Build Badge Commits-per-month Discord uptime response time Artifact HUB

Chat dashboard dark mode

Chat dashboard

Chatwoot is an open-source, self-hosted customer engagement suite. Chatwoot lets you view and manage your customer data, communicate with them irrespective of which medium they use, and re-engage them based on their profile.

Features

Chatwoot supports the following conversation channels:

  • Website: Talk to your customers using our live chat widget and make use of our SDK to identify a user and provide contextual support.
  • Facebook: Connect your Facebook pages and start replying to the direct messages to your page.
  • Instagram: Connect your Instagram profile and start replying to the direct messages.
  • Twitter: Connect your Twitter profiles and reply to direct messages or the tweets where you are mentioned.
  • Telegram: Connect your Telegram bot and reply to your customers right from a single dashboard.
  • WhatsApp: Connect your WhatsApp business account and manage the conversation in Chatwoot.
  • Line: Connect your Line account and manage the conversations in Chatwoot.
  • SMS: Connect your Twilio SMS account and reply to the SMS queries in Chatwoot.
  • API Channel: Build custom communication channels using our API channel.
  • Email: Forward all your email queries to Chatwoot and view it in our integrated dashboard.

And more.

Other features include:

  • CRM: Save all your customer information right inside Chatwoot, use contact notes to log emails, phone calls, or meeting notes.
  • Custom Attributes: Define custom attribute attributes to store information about a contact or a conversation and extend the product to match your workflow.
  • Shared multi-brand inboxes: Manage multiple brands or pages using a shared inbox.
  • Private notes: Use @mentions and private notes to communicate internally about a conversation.
  • Canned responses (Saved replies): Improve the response rate by adding saved replies for frequently asked questions.
  • Conversation Labels: Use conversation labels to create custom workflows.
  • Auto assignment: Chatwoot intelligently assigns a ticket to the agents who have access to the inbox depending on their availability and load.
  • Conversation continuity: If the user has provided an email address through the chat widget, Chatwoot will send an email to the customer under the agent name so that the user can continue the conversation over the email.
  • Multi-lingual support: Chatwoot supports 10+ languages.
  • Powerful API & Webhooks: Extend the capability of the software using Chatwoot’s webhooks and APIs.
  • Integrations: Chatwoot natively integrates with Slack right now. Manage your conversations in Slack without logging into the dashboard.

Documentation

Detailed documentation is available at chatwoot.com/help-center.

Translation process

The translation process for Chatwoot web and mobile app is managed at https://translate.chatwoot.com using Crowdin. Please read the translation guide for contributing to Chatwoot.

Branching model

We use the git-flow branching model. The base branch is develop. If you are looking for a stable version, please use the master or tags labelled as v1.x.x.

Deployment

Heroku one-click deploy

Deploying Chatwoot to Heroku is a breeze. It's as simple as clicking this button:

Deploy

Follow this link to understand setting the correct environment variables for the app to work with all the features. There might be breakages if you do not set the relevant environment variables.

DigitalOcean 1-Click Kubernetes deployment

Chatwoot now supports 1-Click deployment to DigitalOcean as a kubernetes app.

Deploy to DO

Other deployment options

For other supported options, checkout our deployment page.

Security

Looking to report a vulnerability? Please refer our SECURITY.md file.

Community? Questions? Support ?

If you need help or just want to hang out, come, say hi on our Discord server.

Contributors ✨

Thanks goes to all these wonderful people:

Chatwoot © 2017-2024, Chatwoot Inc - Released under the MIT License.

chatwoot's People

Contributors

clairton avatar nestordavalos avatar ricardocarrer avatar ruben18salazar3 avatar sendingtk 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

Watchers

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

chatwoot's Issues

Cant create Meta Cloud API channel

I'm trying to create a new WPP Cloud API channel and when I fill in all the infromations nothing happens when I click on Create Button.

The button simply remains unclickable.

Custom logo not persisting

When a new image deploy happens or even new deploy with the same version, logo returns to chatwoot default, different from conversation data that is persisting ok. Is it possible to also persist custom logo?

Erro ao mencionar um agente de outro time - mensagem privada

Describe the bug

Quando um agente de outro time é mencionado em uma conversa privada para pedir apoio a solução de alguma situação, as menções não entram no @menções.
image
image
image

To Reproduce

Recebo a mensagem na caixa de e-mail ao mencionar o agente ela não consegue ver a mensagem a qual foi atribuida.
Ao entrar na mensagem privada e digitar @ aparece todos os agentes cadastrados na base, mas ele não consegue visualizar a mensagem o qual foi mencionado.
Estou usando Hetzner - Instalação via portainer - Versão 3.10.3

Expected behavior

Ao mencionar um agente na mensagem privada, entrar no @menções do usuário.

Environment

Linux VM

Cloud Provider

Other [please specify in the description]

Platform

Browser

Operating system

ubuntu 20.04

Browser and version

No response

Docker (if applicable)

No response

Additional context

pelo fato de ser possivel selecionar qualquer agente cadastrado na mensagem privativa me faz enterder que posso acionar internamente qualquer agente para auxilio com a demanda.

Error upload file in chatwoot + evolution api

Ao realizar um upload de uma imagem percebo o seguinte erro:

image

Ao investigar percebo que tenho o seguinte erro:

response: {
    **status: 404,**
    statusText: 'Not Found',
    headers: Object [AxiosHeaders] {
      'cache-control': 'no-cache',
      'content-type': 'text/html',
      'referrer-policy': 'strict-origin-when-cross-origin',
      'strict-transport-security': 'max-age=63072000; includeSubDomains',
      'x-content-type-options': 'nosniff',
      'x-download-options': 'noopen',
      'x-frame-options': 'SAMEORIGIN',
      'x-permitted-cross-domain-policies': 'none',
      'x-request-id': '32977e64-5934-4d7b-8905-073df47ce379',
      'x-runtime': '0.004957',
      'x-xss-protection': '0',
      date: 'Fri, 07 Jun 2024 14:35:42 GMT',
      'transfer-encoding': 'chunked'
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [Object [AxiosHeaders]],
      responseType: 'stream',
      method: 'get',
      **url: {dominio}/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcGdCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--6234657dcfa80405492a2ef2e9182829cd13cef0/image.png',**
      data: undefined
    },

Pelo meu entendimento a URL gerada não esta sendo acessivel.

Configuração de armazenamento

- ACTIVE_STORAGE_SERVICE=amazon

 image: sendingtk/chatwoot:v3.7.0

Agent Super Vision

Para mejorar un modo de Supervisor de Agente, vale considerar que la función "agent_conversation_viewed" a veces dificulta para quien es el agente debido al número de informaciones, pero es muy buena y excelente en su función para el agente que supervisa la atención. Sería interesante agregar la posibilidad de seleccionar solo a los agentes que pueden ver quién vio los mensajes en lugar de que todos tengan la opción de ver.

Hablando más sobre la visualización, también es muy útil para quienes supervisan la atención la función de poder visualizar las conversaciones pero sin que chawoot las marque como leídas. Es decir, este agente tendría la posibilidad de visualizar las conversaciones sin dejar rastros y también supervisar la atención.

Chatwoot is changing symbols in URLs in received messages

Describe the bug

When receiving a URL on Chatwoot, it changes the _ to *

For example: https://blabla.com/doc/bla_bla_bla
image

It changes it to: https://blabla.com/doc/bla*bla*bla
image

And, consequently, the URL does not open

What I noticed is that on WhatsApp, to make a word italic we put it between underscores _ like this _
On Chatwoot, for italics we use 1 asterisk: * like this * and for bold we use 2 * : * * like this * * (without spaces)

So, I think Chatwoot is making this change to match the format initially sent, but it is a URL and not a text, so it messes up the URL.

When sending a URL through Chatwoot, it is sent normally. No changes are made. The bug only occurs when the message is received in Chatwoot
image
image

To Reproduce

  1. Send a URL containing a snippet between underscores, like this: https://blabla.com/doc/bla_bla_bla
  2. Open the message in Chatwoot
  3. It will be received like this: https://blabla.com/doc/bla*bla*bla
  4. Send the same URL (https://blabla.com/doc/bla_bla_bla) through Chatwoot to a contact;
  5. It will be sent and received correctly (like this: https://blabla.com/doc/bla_bla_bla)

Expected behavior

The URL be received exactly as it was sent

Environment

Docker

Cloud Provider

Other [please specify in the description]

Platform

Browser

Operating system

Ubuntu 20.04

Browser and version

Chatwoot 3.10.3

Docker (if applicable)

No response

Additional context

No response

Instangram Unsend only work with Mobile App

Describe the bug

When a message is unsend on the web it does not delete in Chatwoot but works when deleting from the Instagram mobile app irrespective of where the message was sent from.

To Reproduce

Create an IG inbox
Send message
Delete using Instagram Web

Expected behavior

Message is supposed to be deleted irrespective of where it was sent from.

Environment

Docker

Cloud Provider

None

Platform

None

Operating system

debian 12

Browser and version

No response

Docker (if applicable)

Client: Docker Engine - Community
Version: 27.0.3
API version: 1.46
Go version: go1.21.11
Git commit: 7d4bcd8
Built: Sat Jun 29 00:02:50 2024
OS/Arch: linux/amd64
Context: default

Server: Docker Engine - Community
Engine:
Version: 27.0.3
API version: 1.46 (minimum version 1.24)
Go version: go1.21.11
Git commit: 662f78c
Built: Sat Jun 29 00:02:50 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.18
GitCommit: ae71819c4f5e67bb4d5ae76a6b735f29cc25774e
runc:
Version: 1.7.18
GitCommit: v1.1.13-0-g58aa920
docker-init:
Version: 0.19.0
GitCommit: de40ad0

Client: Docker Engine - Community
Version: 27.0.3
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.15.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.28.1
Path: /usr/libexec/docker/cli-plugins/docker-compose

Server:
Containers: 25
Running: 25
Paused: 0
Stopped: 0
Images: 30
Server Version: 27.0.3
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: active
NodeID: oxhyaom4ve1cpwlu4ohoe1324
Is Manager: true
ClusterID: hsi9qvb0bbxgjkfh9cgetmmm2
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 0
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 2607:5300:60:8107::1
Manager Addresses:
[2607:5300:60:8107::1]:2377
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: ae71819c4f5e67bb4d5ae76a6b735f29cc25774e
runc version: v1.1.13-0-g58aa920
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.1.0-21-amd64
Operating System: Debian GNU/Linux 12 (bookworm)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 62.69GiB
Name: artlab
ID: 338b2a16-6953-4b56-9512-fe6c8451bfd6
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

Additional context

Chatwoot-N 3.10.3

hide_unassigned_for_agent no funciona

image

Proceso:

  • Actualización del stack docker de la versión 3.7.5 a la versión 3.8.0, siguiendo el ejemplo del stack de nestor.
  • Actualización de la base de datos.
  • Marcación de la casilla hide_unassigned_for_agent
  • Guardar limpieza de cache.

image

El agente puede seguir viendo la pestaña de conversaciones desasignadas.

nota: uso minio s3 como storage.

Trate de hacer la instalación limpia de la base de datos pero me dio el mismo error.

Feature Suggestion: Dashboard Links

I propose a new feature similar to a Dashboard App where users can create and manage dashboard links. Instead of opening these links in a conversation tab, they would be organized into a dedicated menu item. This feature would enhance user experience by centralizing access to various dashboards.

Concept:
Main Menu Integration:

Introduce a new icon in the main right-hand menu labeled "Platforms".
Clicking this icon would navigate to a secondary menu specifically for dashboard links.
Secondary Menu Display:

The secondary menu currently displays teams, folders, and labels. This new feature would replace or supplement these with a list of registered dashboard links.
Example layout:
Dashboard Links
Item 1
Item 2
Item 3
Item 4
Link Functionality:

When a user clicks on a dashboard link, the content would be displayed in a full-screen iframe within the platform.
This iframe approach ensures that users remain within the platform environment, enhancing continuity and user engagement.
Login Persistence:

The system would save login credentials for these platforms, allowing seamless access to the dashboards (e.g., Manager Evolution, specific websites).
This would eliminate the need for repeated logins, making it more convenient for users and encouraging longer platform usage.
Benefits:
Centralized Access: Users can easily access various dashboards from a single, organized menu.
Seamless Integration: Full-screen iframes provide an immersive and uninterrupted user experience.
Enhanced Engagement: By reducing login friction, users are more likely to spend extended time on the platform.
This feature would greatly improve the usability and efficiency of the platform, making it a more attractive tool for users who rely on multiple dashboards for their workflow.

Analyze the possibility of hiding the inbox

Given the evolution of the version, I would like to request an analysis of hiding the agents' inbox, (AJUNTANDO) with the existing options of hiding all tabs, filters, etc.

In a business environment, managers often do not want their employees (agents) to view active inboxes (providing greater security), so I would like to request the analysis of creating an option to hide it as it already exists elsewhere (tab all, filters, unassigned)

NOTE: If it were possible by (box would be ideal) but if not because of its complexity if it is general I believe it would help a lot

image

Show deleted messages

A new feature could be incorporated. When the person on the other side deletes a message, our chatwoot continues show that message in gray, with the legend Message Deleted. It would be good if it worked for any type of message such as text, images, audios, etc.

Chatwoot with Unoapi inbox

After the new Unoapi inbox, the creation of new inbox oficial whatsapp cloud is not working. Using sendingtk/chatwoot:v3.10.3 image, ubuntu 20.04, redis latest and postgres 14. I unintalled twice all of them and continue the same. Portainer with docker swarm.

Works fine rolling back 3.9.5

Add a "Conversation Files" field to centralize the media exchanged in the chat

It takes a long time to find a file or media sent or received in a chat, as we have to scroll through the entire conversation to find a specific file or media exchanged with the contact, and to download all or some of the files.

Describe the solution you'd like
Centralize the chat midia/files at the "conversation information" field, or creat an specific field for this, maybe at the same place where are dashboard apps, right next to the "messages".

It would be better if the files remain vinculated to all conversations with the contact (in case the chat is resolved, the files would remain at the "conversation workspace").

Other interesting feature is the possibilite to select some or all files to download in bulk.

image

view_thumbnail_image_message

Mensagem de Imagem

Seria muito interessante exibir em miniatura a imagem ou vídeo que foi escolhida ao por resposta ao invés de exibir somente o texto "mensagem de imagem". Considerando que hoje em dias muitas empresas trabalham muito com envio de imagens e vídeos.

Whatsapp Cloud API Creation Button

Describe the bug

I am having the same problem as the issue #78. The button, after you enter the data from Meta, for de WPP Cloud does not work. WPP Cloud worked fine in version 3.10.0. Rolling back to versions before the implementation the new feature of the Unoapi works. And I tried to use images from Clairton and the same happens.

To Reproduce

imagem_2024-07-13_072045244

Expected behavior

No response

Environment

Docker

Cloud Provider

None

Platform

None

Operating system

No response

Browser and version

No response

Docker (if applicable)

No response

Additional context

No response

Version 3.10.3: Unoapi Inbox -

Does not generate QRcode when you click in "Conectar", boths buttons (Atualizar e Conectar ) stars at same time and then comes de message: "configurações da caixa de entrada atualizadas com sucesso".

WhatsApp's 24-hour red message does not appear for agents.

Hello everyone, I hope you are all doing well.

Recently, I noticed that users with agent-level access are not able to see the 24-hour red stripe on WhatsApp.

I use it here at the company, and some users have reported this to me.

My version: v3.10.3

Hiding agent filter is not working in version 3.8.0

When updating to the latest version 3.8.0, it was observed that the option to hide filters (queries) for agents is not being effective, even though the option is checked in the account, it has no application

:: Steps to reproduce ::

1 - In accounts (SuperAdmin), open the account options and select to hide agent filters.
image

2 - log in to chatwoot with an agent account
image

3 - note that the filter is not hidden
image

:: Correction ::
Analyze the application of hiding (FILTERS) for connected agents.

remove chatwoot brand from password recovery panel (login screen)

When using the version I noticed that the 'chatwoot' brand is fixed on the password recovery screen, in this case I would like to request the possibility of pulling from the fields where we enter the company name

step by step for detection

1 - Call the application URL

2 - Click on recover password

image

Error when trying to update to v3.10.3.

bundler: failed to load command: sidekiq (/gems/ruby/3.2.0/bin/sidekiq)
/usr/local/bundle/gems/bundler-2.5.14/lib/bundler/definition.rb:594:in materialize': Could not find rails-7.0.8.1, dotenv-rails-2.8.1, devise_token_auth-1.2.1, administrate-field-active_storage-1.0.1, grpc-1.54.3, sentry-rails-5.14.0, sentry-ruby-5.14.0, sentry-sidekiq-5.14.0, sidekiq-7.2.1, web-push-3.0.0, omniauth-rails_csrf_protection-1.0.1, informers-0.2.0, actioncable-7.0.8.1, actionmailbox-7.0.8.1, actionmailer-7.0.8.1, actionpack-7.0.8.1, actiontext-7.0.8.1, actionview-7.0.8.1, activejob-7.0.8.1, activemodel-7.0.8.1, activerecord-7.0.8.1, activestorage-7.0.8.1, activesupport-7.0.8.1, railties-7.0.8.1, i18n-1.14.4, nokogiri-1.16.4, redis-client-0.19.1, dotenv-2.8.1, nio4r-2.7.0, rexml-3.2.5, google-protobuf-3.25.2, googleapis-common-protos-types-1.11.0, concurrent-ruby-1.2.3, hkdf-1.0.0, method_source-1.0.0, blingfire-0.1.8, numo-narray-0.9.2.1, onnxruntime-0.7.6, net-imap-0.4.9, builder-3.2.4, erubi-1.12.0, marcel-1.0.2, minitest-5.22.3, zeitwerk-2.6.13, mini_portile2-2.8.6, racc-1.7.3 in locally installed gems (Bundler::GemNotFound) from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/definition.rb:193:in specs'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/definition.rb:259:in specs_for' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/runtime.rb:18:in setup'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler.rb:164:in setup' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/setup.rb:32:in block in <top (required)>'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/ui/shell.rb:159:in with_level' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/ui/shell.rb:111:in silence'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/setup.rb:32:in <top (required)>' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/cli/exec.rb:56:in require_relative'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/cli/exec.rb:56:in kernel_load' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/cli/exec.rb:23:in run'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/cli.rb:455:in exec' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/vendor/thor/lib/thor/command.rb:28:in run'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in invoke_command' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/vendor/thor/lib/thor.rb:527:in dispatch'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/cli.rb:35:in dispatch' from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/vendor/thor/lib/thor/base.rb:584:in start'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/cli.rb:29:in start' from /usr/local/bundle/gems/bundler-2.5.14/exe/bundle:28:in block in <top (required)>'
from /usr/local/bundle/gems/bundler-2.5.14/lib/bundler/friendly_errors.rb:117:in with_friendly_errors' from /usr/local/bundle/gems/bundler-2.5.14/exe/bundle:20:in <top (required)>'
from /usr/local/bundle/bin/bundle:25:in load' from /usr/local/bundle/bin/bundle:25:in

'

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.