Coder Social home page Coder Social logo

bios-marcel / cordless Goto Github PK

View Code? Open in Web Editor NEW
1.6K 23.0 140.0 5.46 MB

The Discord terminal client you never knew you wanted.

License: BSD 3-Clause "New" or "Revised" License

Go 99.52% JavaScript 0.01% Shell 0.46% Dockerfile 0.02%
discord cli terminal commandline tview discordgo client alternative tui

cordless's Introduction

I AM CLOSING DOWN THE CORDLESS PROJECT

Hey, so I know this is somewhat of a bummer, but I got banned because of ToS violation today. This seemed to be connected to creating a new PM channel via the /users/@me endpoint. As that's basically a confirmation for what we've believed would never be enforced, I decided to not work on the cordless project anymore. I'll be taking down cordless in package managers in hope that no new users will install it anymore without knowing the risks. I believe that if you manage to build it yourself, you've probably read the README and are aware of the risks. I'll keep the repository up, but it'll be archived (read-only) and I have vendored the dependencies, meaning that you'll probably always be able to build the project from source as long as you have a compatible go compiler. And yes, you'll still be able to use existing binaries for as long as discord doesn't introduce any more breaking changes. However, be aware that the risk of getting a ban will only get higher with time!

Cordless

The discord server still exists and there's still some people talking, so feel free to check it out if you want to:

https://discord.gg/fxFqszu

Overview

WARNING: Third party clients are discouraged and against the Discord TOS. There have already been cordless users that got banned, including me (Bios-Marcel, the maker and maintainer)

Cordless is a custom Discord client that aims to have a low memory footprint and be aimed at power-users.

The application only uses the official Discord API and doesn't send data to third parties. However, this application is not an official product by Discord Inc.

Demo Screenshot

Installation

Using prebuilt binaries

If you don't want to build the application yourself or use some kind of package management system, you can get the latest binaries for the three major systems in the release overview:

https://github.com/Bios-Marcel/cordless/releases/latest

Building from source

In order to execute the following commands, you need to install go 1.13 or higher. You can find golang packages at https://golang.org/doc/install. On top of that, you need to have git installed. It can be fund at https://git-scm.com/downloads.

UPDATES HAVE TO BE INSTALLED MANUALLY

Open a command line and execute the following commands:

git clone https://github.com/Bios-Marcel/cordless.git
cd cordless
go build

This will create an executable file called cordless or cordless.exe depending on whether you are on Windows or not. Move that file anywhere that your terminal can find it. I recommend adding a bin folder to your user home and adding it to your systems PATH variable. Please search the internet, using your favourite search engine, for how to set an environment variable in XXX in order to update your PATH variable correctly.

For updateing you simply have to delete the folder you downloaded last time and repeat the instructions.

Note:

  • X11 users need xclip in order to copy and paste.
  • Wayland users need wl-clipboard in order to copy and paste.
  • Mac OS users need pngpaste in order to copy and paste images.

Login

YOUR PASSWORD IS NEVER SAVED LOCALLY.

Logging in works via the UI on first startup of the application.

If you are logging in with a bot token, you have to prepend Bot in front of the token.

If you need to find out how to retrieve your token, check the wiki.

Currently captcha-code login isn't supported. Thanks for your SHIT-API, Google

Quick overview - Navigation (switching between boxes / containers)

Shortcut Action
Alt + S Sets the focus on the servers (guilds) container
Alt + C Sets the focus on the channels container
Alt + T Sets the focus on the messages container
Alt + M Sets the focus on the messages input field
Alt + U Sets the focus on the users container
Alt + P Opens the direct messages container
Alt + . Toggles the internal console view

Further shortcuts / key-bindings can be found in the manual on the internal console with the command manual.

If any of the default commands don't work for you, open the keyboard shortcut changer via Ctrl + K.

Extending Cordless via the scripting interface

Check the wiki

Troubleshooting

If you happen to encounter a crash or a bug, please submit a bug report via the projects GitHub issue tracker. Bugs reported via Discord will probably be forgotten or overseen.

For general problems faced by cordless users, check out the wiki at: https://github.com/Bios-Marcel/cordless/wiki/Troubleshooting

If you need help or have questions that you don't want to create an issue for, just join our Discord server: https://discord.gg/fxFqszu

FAQ

In order to find answers to common questions, check out the FAQ in the wiki:

https://github.com/Bios-Marcel/cordless/wiki/FAQ

This project isn't for you, if

  • You like fancy GUI
  • You want to see images, videos and whatnot inside of the application itself
  • You need the voice/video calling features
  • You need to manage or moderate servers

Similar projects

Here is a list of similar projects:

Hit me up if you have a similar project, and I'll gladly add it to the list.

Credits

Big thanks to JetBrains for providing the cordless project with free licenses!

This project was mainly inspired by Southclaws Cordless, which he sadly didn't develop any further.

cordless's People

Contributors

0xflotus avatar 2qar avatar amyrahmady avatar ariqfadlan avatar avahe-kellenberger avatar bios-marcel avatar fl4ke avatar intexisty avatar joshiemoore avatar k7hpn avatar marvinklar avatar misuto avatar ndagestad avatar oneechanhax avatar pegasusepsilon avatar pkfln avatar polyzium avatar roket1428 avatar sacules avatar southclaws avatar spacemud avatar thedinodude avatar toby222 avatar torstehu 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

cordless's Issues

spoilers

What do you want

Discord implemented spoilers, cordless should synchronize

Why

Why not?

Implementation hints

Notifications on the latest snapped version don't work.

Is your source up to date

  • Yes
  • No

What happened

Notifications on the latest snapped version don't work.

What did you expect to happen

Notifications to work like in the non-snap version.

How do you reproduce this bug

Install cordless via snap and make someone send you a private message or mention you in a server.

How to fix

The snap needs to stage libnotify / libnotify-bin? somehow, since that's where the notify-send binary comes from. Alternatively the dbus can be used for notifications, however, that's not enough. Since not every system uses the dbus for notifications.

System information

Key Value
OS Ubuntu 18.10
Architechture x64

Editing message brokes @

Is your source up to date

  • Yes
  • No

What happened

I edited message where I had @ ed myself, then @ has gone.

What did you expect to happen

@ woudln't get affected by editing message

How do you reproduce this bug

asciicast

Error output

How to fix

System information

Key Value
OS Linux Mint 19.1
Architechture amd64

Multiaccount support

What do you want

Multiaccount support!

Why

I am annoyed by having to log in with a second user on one of my main devices or even asking other people to test with me. If I had multiaccount support, I could just spin up a different instance of cordless!

Implementation hints

On user join/left message

What do you want

There is emtpy filed printed when user joins or left server/group

Why

I can't explain why 😆

Implementation hints

image
vs
image

Generalizing the text input component

Currently the message editor is being used for the command input as well. That is convenient as it requires less code, however, the message input support some features that the command input simply doesn't need:

  • Mentioning
  • Multiline support

There should be a general editor component that has the following features:

  • Autocomplete (Tab & Popup like the mention dialog. This feature could then be used for emojis, mentions, commands and more!)
  • General text editing (The usual stuff you'd expect)
  • Optional line breaking

It should be easy to extend it using composition.

Unread channel markers

What do you want

The main thing that's stopping me from using it full time (and was with my impl) is the ability to mark channels as unread so I can switch and join a conversation.

This could be visually implemented by simply bolding or colouring or backgrounding the channel name, that's the easy part.

The hard part is synchronising it between clients. I did a bit of research when I was working on cordless and couldn't find an answer. The API doesn't seem to expose unread status for a user's channels so there must be a hidden API that stores this state on their service.

This could be first implemented simply as the timestamp of the last seen message for each channel in each server. The difficult part, which I think would be required for completeness of this feature, would be getting this information synchronised properly. So when I read a channel on my phone, cordless knows this channel is now read and doesn't mark it as unread.

Why

Knowing when a channel has new messages is necessary for powerusers and admins who want to know what's going on across an entire server. Some users only hang around in a handful of channels but moderators/admins/active users probably want to keep an eye on discussion in all channels.

Links not getting pasted correctly

Is your source up to date

  • Yes
  • No

What happened

Link got splitted

What did you expect to happen

Link must got pasted correctly

How do you reproduce this bug

Here is everything shown
asciicast

Error output

There was no error output

How to fix

I'm not sure

System information

Key Value
OS Linux Mint 19.1 Cinnamon
Architechture x86_64

Multiline support

What do you want

There has to be proper multiline support, since scrolling sideways is very annoying.

Why

Messages can't be read properly, especially on small screens.

Improve message input component

The mesasge editor is still lacking some features:

  • Navigation
    • Ctrl+Left
    • Ctrl+Right
    • Pos1
    • End
    • Ctrl+Pos1
    • Ctrl+End
  • Multi-character selection
  • Select all via Crl+A
  • Selection still a bit weird when selection over multiple lines (\n not being handled very nice)
  • Code needs to be simplified
  • Autocomplete
  • New lines don't use Shift+Enter, but Alt+Enter

    gdamore/tcell#254

  • Word wrap doesn't add to the requested height

Originally posted by @Bios-Marcel in #9 (comment)

Render message links in a special way

What do you want

Currently message links are just a normal URL, however, this will cause the terminal to open the browser when clicking the URL. Instead the user should get a special rendering, like mentions and channel-links get one. Then there should be a context sensitive action that allows jumping to the message. If there are multiple links we could open a choice dialog or so.

Why

It's annoying that you have to use two different clients.

Implementation hints

Customizable shorcuts

What do you want

As many of the applications shortcuts as possible should be customizable.

Why

Everyone uses a different terminal emulator, a different operating system and has different third party software on his/her machine. Therefore it'd be nice if you could change any of the clashing keyboard shortcuts.

Implementation hints

This is kind of hard via a configuration file, since the user would need to know all the correct constant numbers specified in tcell. On top of having to know those constants, the userinput can be incorrect, therefore it'd need validation. Instead there should be a UI where you can chose an action and press the keys that you want as the shortcut. That UI should handle clashes and such.

Texteditor heighcalculation incorrect

Is your source up to date

  • Yes
  • No

What happened

The texteditor often unnecessarily requests more height.

What did you expect to happen

That more height is only requested if the user actually filled the current line or manually inserts a linebreak.

How do you reproduce this bug

Just type a lot.

How to fix

Correct the line count calculation. This probably needs to be a feature of Bios-Marcel/tview, because that is the only place knowing about the line wrapping.

System information

Key Value
OS Ubuntu-18.10
Architechture x64

Cannot login or start

Is your source up to date

  • Yes
  • No

What happened

After you login, you either get no output or a 404 error code for the websocket.

What did you expect to happen

It to run.

How do you reproduce this bug

Run cordless and login.

Error output

How to fix

System information

Key Value
OS Arch Linux
Architechture amd64

Update manager

What do you want

I want you to start making releases

Why

In order to see if there is update available on cordless startup

Implementation hints

Use Google's GitHub API to get latest release from github, then you should parse it by semver pkg and if it's greater than the user has, give him/her coloured message that an update is available with cordless configuration file lies at.. message on startup

Support for discords custom emojis

What do you want

Support for discords custom emojis. If possible the user should be able to see and use them.

Why

It's quite annoying not to be able see / use those emojis.

Implementation hints

This could probably be implemented via a custom placeholder font that gets recompiled upon restart.

Treeview search only for actual element name

Is your source up to date

  • Yes
  • No

What happened

Treeview search isn't working nicely when there is a mention prefix.

What did you expect to happen

Still being able to type res in order to find (@You) respected.

How do you reproduce this bug

Make someone mention you and try to jump to the channel by typing the name.

Error output

How to fix

Add a SetPrefix to the node, so that you can still separate the prefix from the actual name without having to do string operations on the nodes text.

System information

Key Value
OS Arch
Architechture x64

Messages are kept shown if they're all deleted at once time

Is your source up to date

  • Yes
  • No

What happened

Some bots like yagpdb, dyno etc. provide feature to clear chat messages, so I did that but messages were kept until I re-switched to the same channel

What did you expect to happen

Messages must got disappeared

How do you reproduce this bug

asciicast

Error output

How to fix

System information

Key Value
OS Arch Linux
Architechture x86_64

Notifications

What do you want

Notifications. Discord usually displays a notification when receiving a message or a call. Messages should send a notification and so should calls. However, calls shouldn't send a calling sound, as that's kind of annoying anyway. Notifications should be optional, but enabled by default.

On windows https://github.com/go-toast/toast seems to be a good option, since I have no interest in supporting any windows that is older than Windows 10.

On linux notify-send will be invoked.

On MacOS i'll probably use https://github.com/Coccodrillo/apns.

Why

It's annoying to not be able to notice when someone texts or calls you.

Token length isn't checked.

Is your source up to date

  • Yes
  • No

What happened

If you choose token way of authorization and input wrong length token, it'll be stored in config.json, so that every time you try to login, it tries authorization with token saved in config. So that, you have to clear token field in config.

What did you expect to happen

Token lengths must be checked before storing them in config

How do you reproduce this bug

asciicast

Error output

How to fix

I'll make pull request

System information

Key Value
OS Mint 19.1
Architechture amd64

Online users aren't displayed correctly

Is your source up to date

  • Yes
  • No

What happened

The list of online users on the right side is totally incorrect.

What did you expect to happen

A correct listing with the correct role weights.

How do you reproduce this bug

Open cordless and chose a server.

Error output

None

System information

Key Value
OS Ubuntu 18.04
Architechture x64

The user tree resets the selection on refresh

Is your source up to date

  • Yes
  • No

What happened

The user tree resets the selection on refresh.

What did u expect to happen

The selection should always be preserved when an update occures.

How do you reproduce this bug

Simply select an entry that isn't the first entry and wait for about 5 seconds.

Error output

None

System information

Key Value
OS Ubuntu 18.04
Architechture x64

Color codes aren't being escaped

Is your source up to date

  • Yes
  • No

What happened

Users can change colors in their names and messages by using the dynamic color feature.

What did u expect to happen

It should instead render as normal text.

How do you reproduce this bug

Simple write a message like [red]Hello [blue]World.

Error output

None

System information

Key Value
OS Ubuntu 18.04
Architechture x64

Role mentioning

What do you want

Being able to mention roles and seeing role mentions highlighted similar to the way user-mentions and channel-mentions are highlighted.

Why

It sucks not to be able to mention roles and see roles being mentioned.

Implementation hints

Properly render mentions and channel-links

What do you want

Those two should both get coloured similar to how it is in the original client. Mentions to yourself should receive a special colour.

Why

You simply won't see mentions and won't know if your own mentions were correct.

Message editing mode is kept after switching channel

Is your source up to date

  • Yes
  • No

What happened

The title says it all

What did you expect to happen

No comment, please

How do you reproduce this bug

asciicast

Error output

How to fix

System information

Key Value
OS Solus 3.9999
Architechture Solus x86_64 (amd64)

Unable to set the focus on the channel tree container

Is your source up to date

  • Yes
  • No

What happened

Focus is not set on the channel tree container when pressing Alt + C

What did you expect to happen

The focus should be set on the channel tree container when pressing the shortcut and when the direct messages container is not visible.

How do you reproduce this bug

By pressing Alt + C

System information

Key Value
OS elementary OS 5.0
Architechture x64

Resizable frames

What do you want

The ability to resize the channel list and user list frames. Since the user list can be hidden, the channel list is probably the preferred option.

This could first start as simple automated, based on the longest available channel name (with upper and lower limits of course).

Why

As a regular in a Discord server, I will learn the channel list well and will not need to sacrifice screen-space for this. I can switch channel just by seeing the first 3-5 characters of the channel name.

Crash on start

~ $ cordless
2019/01/16 21:52:51 Configuration lies at: /home/oliver/.config/cordless
panic: runtime error: index out of range [recovered]
    panic: runtime error: index out of range

goroutine 1 [running]:
github.com/rivo/tview.(*Application).Run.func1(0xc0004e8c00)
    /home/oliver/go/src/github.com/rivo/tview/application.go:149 +0x82
panic(0x76ed20, 0xa71460)
    /snap/go/3095/src/runtime/panic.go:513 +0x1b9
github.com/rivo/tview.(*TreeView).process(0xc000158600)
    /home/oliver/go/src/github.com/rivo/tview/treeview.go:501 +0x477
github.com/rivo/tview.(*TreeView).Draw(0xc000158600, 0x837020, 0xc0000a6340)
    /home/oliver/go/src/github.com/rivo/tview/treeview.go:543 +0x95d
github.com/rivo/tview.(*Flex).Draw(0xc0004486c0, 0x837020, 0xc0000a6340)
    /home/oliver/go/src/github.com/rivo/tview/flex.go:169 +0x295
github.com/rivo/tview.(*Pages).Draw(0xc000448690, 0x837020, 0xc0000a6340)
    /home/oliver/go/src/github.com/rivo/tview/pages.go:246 +0xf8
github.com/rivo/tview.(*Flex).Draw(0xc000448870, 0x837020, 0xc0000a6340)
    /home/oliver/go/src/github.com/rivo/tview/flex.go:169 +0x295
github.com/rivo/tview.(*Application).draw(0xc0004e8c00, 0x0)
    /home/oliver/go/src/github.com/rivo/tview/application.go:363 +0xdb
github.com/rivo/tview.(*Application).Run(0xc0004e8c00, 0x0, 0x0)
    /home/oliver/go/src/github.com/rivo/tview/application.go:155 +0xa7
github.com/Bios-Marcel/cordless/internal/ui.(*Window).Run(0xc00035ff40, 0xc00035ff40, 0x0)
    /home/oliver/go/src/github.com/Bios-Marcel/cordless/internal/ui/window.go:575 +0x2e
github.com/Bios-Marcel/cordless/internal.Run()
    /home/oliver/go/src/github.com/Bios-Marcel/cordless/internal/app.go:55 +0x1d0
main.main()
    /home/oliver/go/src/github.com/Bios-Marcel/cordless/cordless.go:6 +0x20

My assumption is, that this happened due to the fact that there were no servers. The same check might be necessary for other lists, tables and trees.

Rethink the "private chats"

Currently the private chats consist of three groups:

  • Friends
  • Groups
  • Open duo chats

The Open duo chats name is quite awkward and should therefore not be used anymore.

On top of that Open duo chats duplicates the entries from Friends if the chat-partner happens to be a friend. Groups are also nothing else, but an open chat.

The new grouping should be like this:

  • Chats (Groups and open chats)
  • Friends (Subtracting chats)

Chats should come first and should be sorted by the date of the last message (sent / received).

Write up new `how to`s on how to retrieve your token

Currently I have borrowed a picture from somewhere, because I was lazy. Those should be written as markdown, possibly with pictures and exist for the two major browsers as well as the discord client (which is basically chrome).

Message is wrongly displayed when starting a call

Is your source up to date

  • Yes
  • No

What happened

When you call somebody, the chatmessage looks like this:
http://prntscr.com/mmv0r6

What did you expect to happen

The message should be something like: MarvinKlar has started a call.

How do you reproduce this bug

Just start a call.

System information

Key Value
OS Any
Architechture Any

Add toggle in order to see hidden channels

The discord API leaks all channels, even if the requesting user usually can't see those. Some people said they'd like to be able to opt into seeing those channels and their topic. Currently you can see those channels and there is no way to hide them.

Edit the message even if it's not the last message we sent

What do you want

  • I wanna be available to edit my message even if it's not the last message I sent by clicking upper arrow multi times - the more time I click upper arrow, the more the previous message I sent gets edited.

Why

I've to open discord client in case I wrongly typed my message via cordless, then I sent another message. That'll take much time.

Make the text-input multiline

What do you want

Make the text-input multiline.

Why

Sending one-line messages isn't always good, especially when sending code and such.

Pasting only pastes a few characters

Is your source up to date

  • Yes
  • No

What happened

Pasting only puts the first few characters into the message.

What did you expect to happen

Everything from the clipboard should be pasted.

How do you reproduce this bug

Control-Alt-V with a URL in my clipboard

Error output

How to fix

System information

Key Value
OS Arch Linux
Architechture amd64

Scripting interface for customisation

What do you want

Inspired by the days of mIRC and other clients. This would provide users a way to do things like modify messages prior to sending, add AFK messages ("gone fishing.") and other cool things by triggering events in a small VM.

The two contenders for this would be:

(or why not both!?)

Why

I thought of this while playing with the colour feature. While cool, the colour feature doesn't seem like something that should be available by default while at the same time it's trivial to implement - simply replace [yellow] with \033[33m.

This could also lead to some other simple features, nothing too automated as we don't want to give users too much of a chance to get banned with bot-like messages but simple afk messages when @'d would be useful along with fun /shrug like commands to insert common emoticons ( ͡° ͜ʖ ͡°)

syntax highlighting

What do you want

Programming language syntax highlighting

Why

That's how it looks from Discord Client
image
That's how it looks from cordless
image
And this is what each user sending code has to do to read code from cordless easily
image
image

Context-senstitive actions in chat

What do you want

The user should be able to selection a line / message and perform an action on it.

The available action should for now be:

  • Edit - Press e (Added in 610ac87)
  • Delete - Press Delete (Added in 5ad866c)
  • Copy Content - Press c (1424cda)
  • Copy link - Press l (8c7b609)
  • Reply - Press r (58bb35a)
  • Quote - Press q (Added in cea0fc5)
  • Hide / show spoiler content - Press s (449e275)

The selection mode can be toggled with ctrl - s while the chat is focused.

Why

You can't easily do this without overloading controls on the message input, therefore the chat has to offer it.

Implementation hints

Mentioning with autocomplete

What do you want

Mentioning via Roles, Nicknames and Usernames including autocomplete for those three mention types.
The autocomplete should work like this:

Let's say we have two users:

  • Hello
  • HelloWorld

Hel -> Tab -> Hello -> HelloW -> Tab -> HelloWorld

Why

It's quite annoying to be unable to easily mention people.

Respect the users terminal color-set

What do you want

The application should use the users color-set. This should be enabled by default, but be optional.

Why

Some users might have chosen their color-set out of a specific reason. One of those reasons might be their lack of ability to differentiate between low-contrast colors. Therefore the application should respect the users settings.

Message inspect feature

What do you want

A way to inspect a message for its individual elements. Those elements being:

  • mentions
  • channel-links
  • URLs
  • attachments
  • message-URLs

Why

Since there is no mouse cursor, you can simply not interact with specific message elements.

Implementation hints

Either open a new view for a message or make selection within a message available. The latter is more complex but might feel better to the use.

Support for pasting image data

What do you want

In the official discord client you are able to just paste an image from your clipboard. That's quite useful as you needn't manually upload it somewhere.

Why

Out of convenience.

Implementation hints

Probably needs os-specific implementations. Might as well create a new package so that others can benefit from it.

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.