Giter Site home page Giter Site logo

tbkeys's Introduction

Contributor Covenant

tbkeys

tbkeys is an add-on for Thunderbird that uses Mousetrap to bind key sequences to custom commands.

Install

  • Download the tbkeys.xpi file from one of the releases listed on the GitHub releases page.
  • Open the Add-ons Manager in Thunderbird (Tools->Add-ons).
  • Click on the gear icon in the upper right and choose "Install Add-on From File..." and then select the downloaded tbkeys.xpi file.
  • The add-on will self-update from the GitHub releases page when future updates are released.

The tbkeys-lite version of the addon can also be installed from addons.thunderbird.net by searching for "tbkeys-lite" in the Thunderbird addons manager or by downloading the xpi file from this page and following the steps above.

Default key bindings

The default key bindings for the main window are modeled on GMail's key bindings.

Key Function
c Compose new message
r Reply
a Reply all
f Forward
# Delete
u Refresh mail. If a message tab is open, close it.
j Next message
k Previous message
o Open message
x Archive message

Customizing key bindings

To customize key bindings, modify the "key bindings" entries in the add-on's preferences pane which can be accessed from the add-on's entry in the Add-ons Manager ("Add-ons" in the Thunderbird menu). Here are some things to consider when setting key bindings:

  • The "key bindings" entry should be a JSON object mapping key bindings (with Mousetrap syntax as described here) to a valid command (see the Command syntax) section.
  • There are separate fields in the preferences page for setting key bindings for the main Thunderbird window and the compose window. Key bindings do not fire in other windows.
  • Key bindings do not fire in text input fields unless the first key combo includes a modifier other than shift.
  • The preferences page will not allow invalid JSON to be submitted, but it does not sanity check the key bindings otherwise.
  • This old wiki page about Keyconfig also has some commands that are still valid.
  • The Developer Toolbox (Tools->Developer Tools->Developer Toolbox in the menu) can be useful for poking around at the UI to find the name of an element to call a function on.
  • Defining a key sequence (meaning multiple keys in succession) where the first key combination in the sequence is the same as a built-in shortcut (like ctrl+j ctrl+k) is not supported. Single keys with modifiers may be mapped to override the built-in shortcuts but not sequences.

Command syntax

A few different styles of commands can be specified for key bindings. They are:

  • Simple commands: These commands follow the format cmd:<command_name> where <command_name> is a command that Thunderbird can execute with goDoCommand(). Most command names can be found in the main command set file of the Thunderbird source code.
  • Simple function calls: These commands follow the format func:<func_name> where <func_name> is a function defined on the Thunderbird window object. That function is called without any arguments.
  • Custom function calls: These commands follow the format tbkeys:<func_name> where <func_name> is the name of a custom function written in tbkeys. Currently, the only available custom function is closeMessageAndRefresh which closes the open tab if it is not the first tab and then refreshes all accounts. This behavior mimics the behavior of the GMail keybinding u.
  • Unset binding: These entries simply contain the text unset. When an unset keybinding is triggered, nothing happens. This can be useful unbinding built-in Thunderbird key bindings which you do not wish to trigger by accident.
  • MailExtension messages: These commands follow the format memsg:<extensionID>:<message> where <extensionID> is the ID of the Thunderbird extension to which to send a message and <message> is a string message to send to the extension using the browser.runtime.sendMessage() MailExtension API. Currently, only string messages are supported because tbkeys stores its commands as strings, though that restriction could possibly be relaxed in the future.
  • Eval commands: These entries may contain arbitrary javascript code on which tbkeys will call eval() when the key binding is triggered. Any entry not matching the prefixes of the other command types is treated as an eval command. NOTE: eval commands are not available in tbkeys-lite and will function the same as unset commands instead.

Common key bindings

Here are some examples of eval commands for commonly desired key bindings:

  • Next tab: window.document.getElementById('tabmail-tabs').advanceSelectedTab(1, true)
  • Previous tab: window.document.getElementById('tabmail-tabs').advanceSelectedTab(-1, true)
  • Close tab: func:CloseTabOrWindow
  • Scroll message list down: window.document.getElementById('threadTree').scrollByLines(1)
  • Scroll message list up: window.document.getElementById('threadTree').scrollByLines(-1)
  • Scroll message body down:
    • v115+: window.gTabmail.currentAboutMessage.getMessagePaneBrowser().contentWindow.scrollBy(0, 100)
    • v102: window.document.getElementById('messagepane').contentDocument.documentElement.getElementsByTagName('body')[0].scrollBy(0, 100)
  • Scroll message body up:
    • v115+: window.gTabmail.currentAboutMessage.getMessagePaneBrowser().contentWindow.scrollBy(0, -100)
    • v102: window.document.getElementById('messagepane').contentDocument.documentElement.getElementsByTagName('body')[0].scrollBy(0, -100)
  • Create new folder: window.goDoCommand('cmd_newFolder')
  • Subscribe to feed: window.openSubscriptionsDialog(window.GetSelectedMsgFolders()[0])

Unsetting default key bindings

The "Unset singles" button in the preferences pane can be used to unset Thunderbird's default single key bindings in the main window. This function set all of Thunderbird's default single key shortcuts to unset unless they are currently set in tbkey's preferences (that is, it won't overwrite tbkeys' existing settings for single key shortcuts).

tbkeys and tbkeys-lite

tbkeys-lite is a version of tbkeys with the ability to execute arbitrary javascript removed.

Security, privacy, and implementation

Before installation, Thunderbird will prompt about the extension requiring permission to "Have full, unrestricted access to Thunderbird, and your computer." The reason for this permission request is that tbkeys must inject a key listener into the Thunderbird user interface in order to listen for key bindings. To do this, tbkeys uses the older Thunderbird extension interface that predates MailExtensions. This interface is what all extensions used prior to Thunderbird 68. The new MailExtensions APIs which provide tighter control on what extensions can do do not have a keyboard shortcut API. If you are interested in seeing a keyboard shortcut API added to Thunderbird, please consider contributing code to the project. Perhaps this ticket in the Thunderbird issue tracker could be a starting point.

To discuss the security considerations related to tbkeys further, it is necessary to review its implementation. As mentioned in the intro, tbkeys relies on the Mousetrap library for managing the keybindings. The bulk of the logic of tbkeys is in implementation.js which is a MailExtension experiment. implementation.js sets up the experiment API which can be called by tbkey's standard (restricted in scope) MailExtension to bind keyboard shortcuts to functions (including a null function for unbinding) and to messages to send to other extensions. implementation.js also loads Mousetrap into each Thunderbird window, tweaks the conditions upon which Mousetrap captures a key even to account for Thunderbird specific UI elements, and defines the function that executes what the user specifies for each key binding. That is all that implementation.js does. It does not access the local file system or any message data and does not access the network.

One of the command modes tbkeys supports is eval. This mode uses eval() to execute arbitrary code provided by the user in implementation.js with full access to Thunderbird's internals. If one does not need to bind to arbitrary code, perhaps there is some security gained by using tbkeys-lite which does not support eval commands. tbkeys-lite is the version published on Thunderbird's Add-ons page. Add-ons published there undergo an independent manual review. Having that barrier of review between yourself and the developer provides an added layer of security.

tbkeys's People

Contributors

arai-a avatar dependabot[bot] avatar e3rd avatar ennea avatar hiasr avatar icyerasor avatar kbsky avatar the-solipsist avatar willsalmanj avatar wshanks 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

tbkeys's Issues

Comparability with Thunderbird 73+

I have been using Dorando keyconfig with Thunderbird 60. I haven't upgraded to TB-68 because that extension is no longer supported. I like what you have done with tbkeys. But I'm hesitant to adopt tbkeys as I'm worried it won't be compatible with TB-73 and beyond. Do you have any idea about future compatibility of tbkeys with Thunderbird.

Great job nonetheless and Thanks.

p.s. It is ridiculous that Mozilla can't incorporate custom user keybindings in all their applications.

Add settings to remap all annoying one-key-shortcuts

This setting would remap only the most dangerous keys that cause havoc if you don't notice, that you have not focused your new mail but the main window and start typing blindly:

{
    "j": "window.goDoCommand('cmd_nextMsg')",
    "m": "window.goDoCommand('cmd_previousMsg')",
    "s": "window.goDoCommand('cmd_openMessage')",
    "k": "window.goDoCommand('cmd_reply')",
    "a": "window.goDoCommand('cmd_replyall')",
    "w": "window.goDoCommand('cmd_forward')",
    "c": "window.MsgNewMessage()"
}

maybe add this as another examle in the Readme

Absolutely no ide how to add a shortcut

Installed this plugin and there is no way to figure out how to disable Ctrl+Enter to avoid accidental mail send.
Is there a chance to get some help button in a configuration dialog?

Remove SHIFT + S

Hello,
how to remove the SHIFT+S key to set all as read?
Thank you.

mark thread as read

i'm search how to add "mark thread as read" code to the json file
i use several time when reading newsgroups

thanks!

Question about shortcut "paste without formatting"

Hello,

First of all, thank you for your addon !

I have one question that is not an issue or a bug (sorry if this is not the proper place to do so) : I'm trying to make "ctrl+v" the default for the function "paste without formatting".

However, it seems the command "cmd_pasteNoFormatting" doesn't exist/work anymore ?
I can't find it here => https://hg.mozilla.org/comm-central/file/tip/mail/base/content/mainCommandSet.inc.xhtml
and it's the only command I found after googling for a while.

I tried => "ctrl+v": "cmd_pasteNoFormatting"
in the addon settings but that doesn't work, nothing is happening.

ddddd

Do you have any idea / work around to make this possible ?
I know they have the "paste without formatting" option from the right click menu, but I'm looking to make that function a shortcut.

Thank you.

Missing single unsets?

First and foremost, thanks for continuing to keep this working and improve it! (It's still amazing to me that the Mozilla guys refuse to allow these to be disabled from their UI ...)

In MacOS, Thunderbird 68.12.0, the native single key shortcuts include the second-level menu item

  • n Go > Next > Unread Message

and the uppercase ones

  • C Message > Mark >All Read
  • J Message > Mark > As Not Junk

In addition, there is a top level menu item

  • K Message > Ignore Subthread

None of these appear to be disabled after use of the "Unset singles" button. (There are some other second level menu items, but I believe they're all overridden by your unset-singles config.)

Perhaps not as harmful as some other easily typed things, but I see no reason to leave them active if that can be avoided.

Nostalgy compatibilty

I see that the tbkeys-lite author (thank you!) is also a fan of Nostalgy. But the two sort of conflict. "tbkeys> unset singles" unsets the 's' (the TB star command), but Nostalgy wants 's' to be the trigger for the save process. (Nostalgy's use is not a dangerous single-key-shortcut, because it just starts a process that can then be aborted. However, Nostalgy's Shft-S could be considered a dangerous single-key-shortcut, for those concerned about triggering something accidentally while they intend to be typing.)

I'm not exactly sure how to best fix this. Removing "s":"unset" from tbkeys does re-enable the Nostalgy behavior. But those wishing to unset all singles would probably wish to tie a different key sequence to the command, and I don't know how to refer to commands of add-ons.

Access rightclick menu in messagepane

Is there a way to access the rightclick menu pane and select an option in messagepane.

I would like to have a shortcut that toggles xnote++ (another thunderbird plugin). In fact, this could open us a variety of additional use cases that accelerate routine workflow.

Further, on a separate note (no pun intended!) can we access thunderbirds menubar options and assign shortcuts.

Thanks and as always this is the indespensible thunderbird plugin.

Create tbkeys-lite

I have been trying to get tbkeys added to the Thunderbird addons site for several months (just waiting in the queue with a 2-3 month wait time between responses from the admins). Ultimately, the admins there say they will not allow tbkeys because it uses eval() (even though it only calls eval() on strings provided by the user).

I don't want to give up eval() because the goal of tbkeys is to replace Keyconfig as much as is possible and also to give users as much power as possible. Still, it is useful to be listed on the Thunderbird addons site. I think the best option is to create a "lite" version of tbkeys that only accepts arguments to goDoCommand for its mappings. This will avoid using eval() and still provide most of the most obvious use cases for tbkeys (remapping the builtin shortcut keys). It will also provide an opportunity to advertise the "more powerful, full version of tbkeys" from the tbkeys-lite listing on the Thunderbird add-on site.

the script intercepts key presses in text search boxes

I got this message by Mehdi A.:

I use Thunderbird 78.0 x64 on Windows 10 x64 version 2004 and the script intercepts key presses in text search boxes like Quick Filter and about:config page. Also, I cannot invoke a menu item, e.g. alt+f for File menu. (locale is en-us and tbkeys version is 2.0.1.)

I cannot reproduce this in Ubuntu 20.04

How to navigate folders?

I set up vim-like shortcuts for navigating messages (j/k for previous/next), but I can't seem to find a way to do the same with folders? I'm looking to use shift+j and shift+k to navigate to previous/next folder. Even one step better would be to have the option of searching for a folder name as a quickswitch, but I would expect that to be very difficult.

Any suggestions as to how navigating next/previous folders can be done seamlessly?

Reset singles missing back-slash (\) and star (*)?

Thank you for making this!
I installed it to TB 78.8.1 and clicked on "Unset Singles". It seems to miss symbol keys such as the backslash (for Collapse All Threads) and the star (*) key (for Expand All Threads). These keys still work.
I manually added these:

"*": "unset",
"\\": "unset"

and now these keys are disabled. Maybe there are more symbol keys that need to be disabled.

unset the Delete key shortcut?

Will, thank you!! for developing this extension and updating it to work with Tbird 78. I've been suffering ever since Dorando stopped working.

Is it possible to "unset" the out-of-the box behavior of the Delete key? I have tried spelling Delete in various ways in the mapping, but no success yet. Thanks!

-Marty

Keys gets triggered in the "New Event" window while writing a description

I configured tbkeys to "Unset singles" keys in the main section.
The problem is that blocking single keys prevents me from typing in the description of an Edit Event window.

Steps to reproduce:

  1. Use these key binding in the main section
{
    "0": "unset",
    "1": "unset",
    "2": "unset",
    "3": "unset",
    "4": "unset",
    "5": "unset",
    "6": "unset",
    "7": "unset",
    "8": "unset",
    "9": "unset",
    "]": "unset",
    "[": "unset",
    "a": "unset",
    "b": "unset",
    "c": "unset",
    "f": "unset",
    "j": "unset",
    "k": "unset",
    "m": "unset",
    "o": "unset",
    "p": "unset",
    "r": "unset",
    "s": "unset",
    "t": "unset",
    "u": "unset",
    "w": "unset",
    "x": "unset",
    "#": "unset"
}
  1. Create a new event in the calendar
  2. Try to write something in the description of the event

How to bind F-keys?

Thanks so much, Will, for creating tbkeys-lite. Life-saver after Dorando-keyconfig.

How do I bind Function (F??) keys?
I tried:
"F11": "func:MsgBodyAllParts"
but it didn't work. It did the Thunderbird default "Show or hide Today Pane"

Using a single alphabet works though, e.g.:
"m": "func:MsgBodyAllParts"

Thanks for any pointers.

Using Thunderbird 78.6; tbkeys-lite 2.1.1

Key bindings are active in the quick search window

So, first, thanks for this extension. Loosing keybindings with TB 68 was so hard. This gets me so close.

However, it seems like the keybindings are active when the filter these messages box is up. I was recently trying to search for "brewery" in some emails, and the moment I hit "r" a reply box popped up.

It would be great if this would only work if the message list was the active focus element.

Mark unread

Hi.
Sorry if this is a silly question, but is there a command to mark a message as unread?
Actually, is there a full list of possible commands somewhere?

Thanks a ton for this by the way!

Just started having a problem in Thunderbird 91

I have been using the add-on for a while now and never had any problems until updating to Thunderbird 91. I never had this problem in TB 78.

Here are the steps to reproduce the problem.

  1. Go to the add on manager in TB
  2. Go to the search box at the top right of the page
  3. Type in something in the search box
  4. Hit Enter which opens a "browser" tab in Thunderbird displaying the Add-ons page
  5. Go to the search box in the top right of this Add-ons page in the "browser" tab
  6. Try to type something in the search box... not all characters will type into the box. For example, "a" and "s" do not type in
    the field, but "d" and "g" do.

If I go to the same page in Firefox or Chrome, the search field works fine. I don't have this problem in any other part of Thunderbird or in any other program either.

With the add-on disabled, I have no problems typing into that search box.

Let me know if I can provide any additional information.

Thanks,
Bill

multimedia / special keys

This is more of a question than an issue (at least for now).
How to configure shortcuts for multimedia / special keys?
I would like to set a custom action for XF86Forward (using KDE / X).

While here, the same question for extended mouse buttons.

Thank you!

readme improvement possibility

Hello, can you please extend the readme with whether keys like "enter" (or "return" (or "ret")), "backspace" (or "bksp"), "delete" (or "del") are available? Thank you in advance

Lost all key bindings after upgrading from 2.0.2

Thunderbird upgraded the extension to a newer extension from 2.0.2 and I lost all key bindings. I could not find where they were stored. I managed to regain them by downgrading back to the 2.0.2. But it would be really great if extension would migrate key bindings between versions.

Also, where are key bindings stored in 2.0.2? I could not find them anywhere.

Add commands for feeds

Hi,

I'm using Thunderbird as a feed reader and I'm interested to add key bindings for creating new folders and subscribe to feeds. I have no experience with writing Thunderbird addons but I know some JS and would give it a try if it is possible. I would be thankful for any pointers or general info about the feasibility.

Need a custom function that only close tab

I need a custom function that only close tab like https://addons.thunderbird.net/en-US/thunderbird/addon/close-on-escape-too/

I tried func:CloseTabOrWindow, but it terminates thunderbird itself too if there is no tab opening. I also tried tbkeys:closeMessageAndRefresh, although it does not terminate thunderbird, it has another side effect: expands all thread (which I don't want either).

What I need is tbkeys:closeMessageAndRefresh, but does not expand thread.

(Note: I am using tbkeys-lite therefore writing arbitrary function is not possible)

Quick Filter / Quick Search for Sender / Recipients / Subject

There used to be a shortcut / keybinding ('', but not sure if it has been the default keybinding) to quickly toggle the filter of the message window by "sender", "recipients" and "subject" of the currently selected mail. I believe it was a feature of the https://github.com/trlkly/dorando-keyconfig add-on.

Maybe this feature can already be achieved with tbkeys. If so, it would be nice to document how to do it.

Thank you very much for this add-on!

options: reset settings

i think it would be good if there's button to reset customizations to defaults, in case you messed up or want to see if there's been any updates to bindings from project itself.

for reference, I'm pasting my current content, but i have no idea is it modified or the default :)

{
    "j": "window.goDoCommand('cmd_nextMsg')",
    "k": "window.goDoCommand('cmd_previousMsg')",
    "o": "window.goDoCommand('cmd_openMessage')",
    "f": "window.goDoCommand('cmd_forward')",
    "#": "window.goDoCommand('cmd_delete')",
    "r": "window.goDoCommand('cmd_reply')",
    "a": "window.goDoCommand('cmd_replyall')",
    "x": "window.goDoCommand('cmd_archive')",
    "c": "window.MsgNewMessage()",
    "u": "if (((window.document.activeElement.id == 'messagepane') || (window.document.activeElement == 'threadTree' )) && (window.document.getElementById('tabmail').tabContainer.selectedIndex!=0)){ window.CloseTabOrWindow()}; window.goDoCommand('cmd_getMsgsForAuthAccounts'); window.goDoCommand('cmd_expandAllThreads')"
}

allow shortcut keys in stand-alone message window

over in the tb forums some folks were working on a shortcut to toggle the show/hide remote content option on messages when the default is set to hide remote content

contributor morat has figured out how to add the ability for a message window to respond to shortcuts; I'm wondering if that can be integrated into this extension for everyone; I'd really like this same functionality for myself without resorting to one-off modification

Commands for scrolling within the message display

Thanks for continuing in the tradition of Keyconfig. In Keyconfig I could use cmd_scrollLineDown and cmd_scrollLineUp to scroll through the pages. However, I can't seem to use those in tbkeys. I can't find that command here. Is that a new limitation in Thunderbird?

still very dangerous one-key shortcuts # and x

I think the main purpose of this add on is to unset the dangerous keys, that cause havoc if you type them uncontrolled because you happen to have the focus on the wrong window, so those new shortcuts should not be in the defaults and only be optional for users that are not afraid of those single-key-shortcuts:

  • "#": "cmd:cmd_delete",
  • "x": "cmd:cmd_archive",

the others are harmless and just open some windows ;)

so better set those as default to

  • "#": "unset",
  • "x": "unset",

command to go to next/previous mail pane?

Not sure if there's already a command to do this, but I use the F6/shift+F6 command to move between the mail panes regularly, but can't seem to find a command to bind to. I'd like to use the same shortcuts, but with a different key. Is this something tbkeys can do?

Need help with identifying go to the top and bottom functions

I'm trying to customize keys for the following Thunderbird functions:

  • Main / message window: go to the top (Mac: Home or Ctrl+Home) and go to the bottom (Mac: End or Ctrl+End)
  • Compose window: go to line beginning (Mac: Cmd+Left) and end (Mac: Cmd+Right) and go to the top (Mac: Cmd+Up) and bottom (Mac: Cmd+Down)

I poked quite a bit in all resources linked from the Readme, but so far could not find these.

This could be just a "documentation ticket". If these could be customized with tbkeys, perhaps they could be added to the Readme?

Key bindings are active in options window

Key bindings are active in options window.
Because of this it's impossible to type "j" character in account configuration if you set this:
{"j": "unset"}
in main key bindings.

Is there a way to create a keybinding for move message to folder?

I found the function here : MsgMoveMessage and I'd love to use that to create a shortcut key to move a message to a specific folder. Is this possible? I've worked at it a while to no avail.

I'd also like to be able to navigate to a folder or filter to a specific tag. Are either of these possible?

Thanks.

Debugging mode

It would be helpful to add a debugging setting that when toggled on would log all element tagName values in stopCallback. This way users could report what tag names are getting callbacks fired or not fired as desired. There may be other points where it would be good to log information.

How do I find more "func:"?

First I must thank you for doing this great job
Finally I can update from v60.*(For Dorando Keyconfig)

I went through the readme, and found no list of funcs

currently I am working on

  • Focus on Folder list
    Workaround by "Focus on MessageFilter", and then "Tab"
    ↑which is not pretty
  • Open Options
    Workaround by Alt+T➤O using autohotkey
    ↑just as ugly(and interfere with mouse cursor sometimes)

Thank you so much

Allow to disable tbkeys in calendar

I'm happy about tbkeys, as it helps me disable dangerous one hit disasters in Thunderbird (ignore thread, archive, etc).
I'm troubled, though, as it currently remains active when editing the calendar (create calendar entry and directly type its name), which frequently kills my calendar, or simply leads to omitted characters in the description of the entry.

Would it be able to include an option that allows the user to disable tbkeys for the calendar tab?

Thanks heaps!

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.