Code Monkey home page Code Monkey logo

browser-extension's Introduction

Taxy AI: Full Browser Automation

Waitlist | Discord

Taxy uses GPT-4 to control your browser and perform repetitive actions on your behalf. Currently it allows you to define ad-hoc instructions. In the future it will also support saved and scheduled workflows.

Taxy's current status is research preview. Many workflows fail or confuse the agent. If you'd like to hack on Taxy to make it better or test it on your own workflows, follow the instructions below to run it locally. If you'd like to know once it's available for wider usage, you can sign up for our waitlist.

Taxy is fully open-source, and we don't send any page contents or instructions to our servers.

Here's Taxy using Google Calendar with the prompt "Schedule standup tomorrow at 10am. Invite [email protected]"

calendar

Table of Contents

Installing and Running

Currently this extension is only available through this GitHub repo. We'll release it on the Chrome Web Store after adding features to increase its usability for a non-technical audience. To build and install the extension locally on your machine, follow the instructions below.

Installing the extension

  1. Ensure you have Node.js >= 16.
  2. Clone this repository
  3. Run yarn to install the dependencies
  4. Run yarn start to build the package
  5. Load your extension on Chrome by doing the following:
    1. Navigate to chrome://extensions/
    2. Toggle Developer mode
    3. Click on Load unpacked extension
    4. Select the build folder that yarn start generated

Running in your browser

  1. Once installed, the browser plugin will be available in two forms:
    1. As a Popup. Activate by pressing cmd+shift+y on mac or ctrl+shift+y on windows/linux, or by clicking the extension logo in your browser.
    2. As a devtools panel. Activate by first opening the browser's developer tools, then navigating to the Taxy AI panel.
  2. The next thing you need to do is create or access an existing OpenAI API Key and paste it in the provided box. This key will be stored securely in your browser, and will not be uploaded to a third party.
  3. Finally, navigate to a webpage you want Taxy to act upon (for instance the OpenAI playground) and start experimenting!

How it Works - The Action Cycle

  1. Taxy runs a content script on the webpage to pull the entire DOM. It simplifies the html it receives to only include interactive or semantically important elements, like buttons or text. It assigns an id to each interactive element. It then "templatizes" the DOM to reduce the token count even further.
  2. Taxy sends the simplified DOM, along with the user's instructions, to a selected LLM (currently GPT-3.5 and GPT-4 are supported). Taxy informs the LLM of two methods to interact with the webpage:
    1. click(id) - click on the interactive element associated with that id
    2. setValue(id, text) - focus on a text input, clear its existing text, and type the specified text into that input
  3. When Taxy gets a completion from the LLM, it parses the response for an action. The action cycle will end at this stage if any of the following conditions are met:
    1. The LLM believes the task is complete. Instead of an action, the LLM can return an indication that it believes the user's task is complete based on the state of the DOM and the action history up to this point.
    2. The user stopped the task's execution. The user can stop the LLM's execution at any time, without waiting for it to complete.
    3. There was an error. Taxy's safety-first architecture causes it to automatically halt execution in the event of an unexpected response.
  4. Taxy executes the action using the chrome.debugger API.
  5. The action is added to the action history and Taxy cycles back to step 1 and parses the updated DOM. All prior actions are sent to the LLM as part of the prompt used to determine the next action. Taxy can currently complete a maximum of 50 actions for a single task, though in practice most tasks require fewer than 10 actions.

Simple Demos

Protecting the main branch in GitHub

main-branch

Searching for and playing the movie Oblivion in Netflix

Oblivion

Creating a calendar event

Calendar

Writing an essay in the OpenAI playground

Playground

Add your own!

If you have an interesting demo you'd like to share, submit a PR to add your own!

Tech Stack

Technology currently used by this extension:

Resources

browser-extension's People

Contributors

adam-lynch avatar arcticfly avatar christopher-hayes avatar dependabot[bot] avatar geekaholiclin avatar gkhngyk avatar lxieyang avatar meandavejustice avatar tluyben 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

browser-extension's Issues

Theory on how to alleviate the token max issue.

I see you are already working on a method using viewport to cutdown on token amount, but what if apply the following as well

  • Take the simplified DOM and cut it into segments that fit
  • Send it to the LLM with a modified version of the user's instructions such as "what portions of the following message are relevant to [user's instructions]: " etc.,
  • store the return in a "master message"
  • repeat steps 2-3 until all parts of the DOM are sent
  • send the master message alongside the user's instructions so that only relevant portions of the DOM are sent.

This would of course introduce unnecessary space for error and ultimately slow down the extension, but maybe it would function in niche cases?

cant't run on chrom

it's nothing at option tab(only Settings Page text)

[HMR] Waiting for update signal from WDS...
index.js:551 [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay disabled.
react-dom.development.js:86 Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot
printWarning @ react-dom.development.js:86
error @ react-dom.development.js:60
render @ react-dom.development.js:29670
./src/pages/Options/index.jsx @ index.jsx:7
webpack_require @ bootstrap:24
(匿名) @ startup:6
(匿名) @ startup:6
index.js:551 [webpack-dev-server] App hot update...
log.js:24 [HMR] Checking for updates on the server...
jsonp chunk loading:502 GET chrome-extension://hlickjjnhdhpmoicoddfnjomhajacjmg/options.1142b4009566846b7180.hot-update.json net::ERR_FILE_NOT_FOUND
webpack_require.hmrM @ jsonp chunk loading:502
Promise.then(异步)
hotCheck @ hot module replacement:246
check @ dev-server.js:14
(匿名) @ dev-server.js:68
emit @ events.js:153
reloadApp @ reloadApp.js:46
ok @ index.js:209
(匿名) @ socket.js:60
client.onmessage @ WebSocketClient.js:50
log.js:26 [HMR] Update failed: TypeError: Failed to fetch
at webpack_require.hmrM (chrome-extension://hlickjjnhdhpmoicoddfnjomhajacjmg/options.bundle.js:41912:20)

Add LLama.cpp

I am New to this but I want one feature to be added that is Lama.cpp or any open source LLM so that we can be free from openai api 🗝
just a feature and too I want to help you all in setting up a perfect tags so that it is neat and please give me a roll to handle that.
I loved this project.

Respecting robots.txt

Is there any way for a website to indicate that they'd like their site to not be automated with this extension?

LiteLLM project support should be added to give user more power to choose different LLM easily instead of just Gpt

Litellm is great foss project for helping users to run local api proxy server which will accept any response in open ai api format.You should read more on it and many projects have implemented it and this project need easy support for variety of llm so LiteLLM is the way.
Please implement it so that other users with different LLM can also test this project and give feedback for improvements wherever needed

Security issues

Taxy uses GPT-4 to control your browser and perform repetitive actions on your behalf does it read and know all my information like my IP adress and the browser version... history ... we need to know

Issue with back button/pdf docs in browser

I have tried a couple of websites where I'm trying to download documents from, it does pretty good job at identifying the docs but then after opening a doc it fails to go back to download more.
Starting page:
https://louisville.edu/purchasing/bids
Next page: this works as expected
https://louisville.edu/purchasing/bids/RP-026-22
Next page: this is where it should download the document but instead it click on the doc which opens a pdf in the browser and then things fail
https://louisville.edu/purchasing/bids/rp-026-22-document

Error
Invalid argument type: Expected a number for argument "elementId", but got ""B186503E38A0DCEF54EB2C9C31EE4177"".

The user requests the following task:

Download all open bids details that I need to submit my proposal

You have already taken the following actions:
I should click on each bid to access its details
click(469)

I should click on all the related documents to download the details
click(476)

Current time: 3/30/2023, 6:11:06 PM

Current page contents:

Response

I should download the PDF file
click("B186503E38A0DCEF54EB2C9C31EE4177")

Action

{
"error": "Invalid argument type: Expected a number for argument "elementId", but got ""B186503E38A0DCEF54EB2C9C31EE4177""."
}

Build Failing

Building the Code is workinng, but when adding to Chrome Extensions, its not working, because one file is missing.

How to annotate the DOM element Taxy is working on

Hi, I am wondering if it's possible to annotate the dom element Taxy is performing click on / typing text in. For example, adding a red bounding box around the border of that element. Any pointers on how to achieve it would be highly appreciated. Thanks!

CDP support

I'm not sure if it's within the scope of this project, but it would be really cool if CDP (Chrome Debugging Protocol) would be supported, in addition to the extension model. That would allow remote or headless browsers to be used as a driver.

How to handle big html?

I've tried on this url - https://www.igniteui.com/grid/basic-editing, and get the following errors:

This model's maximum context length is 4097 tokens. However, your messages resulted in 11438 tokens. Please reduce the length of the messages.

Is there any way to split the big html into several pieces and consolidate the output from openai?

Failed to attach debugger: Cannot access a chrome:// URL

截屏2024-02-21 14 03 54

I just finished install, but when I tried to input some instruction into TaxyAI box, get trhis error:

Error
Failed to attach debugger: Cannot access a chrome:// URL

popup.bundle.js:77394 (_callee$)

case 0:
if (!chrome.runtime.lastError) {
_context.next = 5;
break;
}
console.error('Failed to attach debugger:', chrome.runtime.lastError.message);
reject(new Error("Failed to attach debugger: ".concat(chrome.runtime.lastError.message)));
_context.next = 13;
break;

popup.bundle.js:77375 (tryCatch)
popup.bundle.js:77375 (匿名函数)
popup.bundle.js:77375 (匿名函数)
popup.bundle.js:77376 (asyncGeneratorStep)
popup.bundle.js:77377 (_next)
popup.bundle.js:77377 (匿名函数)
popup.bundle.js:77377 (匿名函数)

GPT4 Not Found

When switching GPT-4, it will remind me that not exist, so need my openai account to get the GPT-4 qualification, right?

With GPT3.5, and the success rate and stability of passing the task are not very good.

Account Token Issue

I ran and it compiled it correctly, but upon trying to prompt, I got this error:
image
Also got this error from the extensions panel. Will look into it tomorrow:
image

open a new tab and visit a URL

is it possible to open a new tab and visit a certain URL.

I tried few variations, but all prompts seem to be focussed on manipulating the DOM and nothing specific to chrome tab manipulation. any pointers?

Open AI API Key is not working

Discussed in #47

Originally posted by Amark9963 July 8, 2023
Hi, I have cloned the project and successfully run the app. But when I use my new Open AI API key, it gives me an error
"You exceeded your current quota, please check your plan and billing details." Though the API key is pretty new and never used before.
Any suggestions, please?

Token exceeded from 128000

I wanted to test this extension on my local, however, I encountered the following error!

I also test with the different current pages like google, bing, github, etc.

Error:
This model's maximum context length is 128000 tokens. However, your messages resulted in 133758 tokens. Please reduce the length of the messages.

2024-03-06_18-24

Support cross-page tasks

I like this project, but when I use it, taxy can only complete the task of a single page, or in other words, after executing the link, subsequent operations will no longer be performed. I wonder if the experience would be better if it supports cross-page tasks?

How to solve the maximum context length limit

I typed "refresh this page", and it reported error as follow

Error
This model's maximum context length is 4097 tokens. However, your messages resulted in 6543 tokens. Please reduce the length of the messages.

Context length exceded

I get this error when running any command on Amazon.co.uk:

"This model's maximum context length is 8192 tokens. However, your messages resulted in 8661 tokens. Please reduce the length of the messages."

I guess this is done while trying to maximize the number of tokens within the GPT-4 maximum context size?

fork and launch? permission request

can i fork this repo for a commercial launch allowing access from my website.
really like the implementation compared to other alternatives like gpt-assistant or puppeteer implementations.
asking for permission here. will close the issue soon too.
let me know your thoughts, could help others build, experiment with users and add features to open source.
Planning to open source my additions too.

yarn error

I tried cloning the repository and executing yarn. I get this error:

error: libtool: file: Release/obj.target/libsass/src/libsass/src/ast.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/ast_fwd_decl.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/backtrace.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/base64vlq.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/bind.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/cencode.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/check_nesting.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/color_maps.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/constants.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/context.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/cssize.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/emitter.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/environment.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/error_handling.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/eval.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/expand.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/extend.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/file.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/functions.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/inspect.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/json.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/lexer.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/listize.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/memory/SharedPtr.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/node.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/operators.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/output.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/parser.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/plugins.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/position.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/prelexer.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/remove_placeholders.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/sass.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/sass2scss.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/sass_context.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/sass_functions.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/sass_util.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/sass_values.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/source_map.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/subset_map.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/to_c.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/to_value.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/units.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/utf8_string.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/util.o is not an object file (not allowed in a library)
error: libtool: file: Release/obj.target/libsass/src/libsass/src/values.o is not an object file (not allowed in a library)
make: *** [Release/sass.a] Error 1
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/Users/vadimliventsev/code/browser-extension/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack     at ChildProcess.emit (node:events:520:28)
gyp ERR! stack     at ChildProcess._handle.onexit (node:internal/child_process:294:12)
gyp ERR! System Darwin 23.5.0
gyp ERR! command "/opt/homebrew/Cellar/node/22.4.1/bin/node" "/Users/vadimliventsev/code/browser-extension/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
gyp ERR! cwd /Users/vadimliventsev/code/browser-extension/node_modules/node-sass
gyp ERR! node -v v22.4.1
gyp ERR! node-gyp -v v8.4.1
gyp ERR! not ok
Build failed with error code: 1
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

Why do I get error pop-ups when using certain websites?

For example, it cannot be used on the YouTube page and the following error pops up.

This model's maximum context length is 4097 tokens. However, your messages resulted in 8461 tokens. Please reduce the length of the messages.

Copying to clipboard from sidebar fails silently

When attempting to copy to the clipboard from the sidebar, the action fails silently without any error message or indication. This can lead to confusion and frustration for users who expect the feature to work. Fixing this issue will improve the user experience and ensure that the functionality is reliable.

Could not establish connection. Receiving end does not exist.

I followed the steps in the readme to setup this extension. However, when I click the green "start task" button, a red rounded rectangle appears at the bottom of the TaxiAI extension box. It says "Could not establish connection. Receiving end does not exist." I did not observe any network traffic in the "network" chrome extension panel, and I did not observe any error or logging message in the console.

How to use in Chrome browser

After the tutorial is installed, when the page is DEBUG, the error is reported:
Error
Cannot Read Properties of Undefined (Reading \ 'Data ')

Refused to set UNSAFE Header "user-agent" in console

Add voice to text command processing

Currently users have to type in a command after activating the Taxy extension in order to start execution on their command. It would be really useful to have a voice-to-command feature that minimized typing.

Add prompt and response token count to task history item

Currently there is no way to see how many tokens were used in the prompt and response for each action. We should read the LLM's response and use it to save the prompt and token count of an action, then display those counts to the user in the task history.

Stuck during build

While following the instructions to build the plugin my M1 got stuck after running yarn start. This is the output

yarn run v1.22.19
warning ../../../package.json: No license field
$ node utils/webserver.js
Failed to load /Users/diego/Documents/ai/browser-extension/.env.
<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:3001/, http://127.0.0.1:3001/
<i> [webpack-dev-server] Content not from webpack is served from .../browser-extension/build' directory
assets by path *.js 14.2 MiB
  asset popup.bundle.js 5.54 MiB [emitted] (name: popup) 1 related asset
  asset panel.bundle.js 5.54 MiB [emitted] (name: panel) 1 related asset
  + 5 assets
assets by path *.html 1.08 KiB
  asset newtab.html 271 bytes [emitted]
  asset panel.html 225 bytes [emitted]
  + 3 assets
assets by path *.png 11.1 KiB
  asset 7a1ed082803ab6213c82.png 4.64 KiB [emitted] [immutable] [from: src/assets/img/icon-128.png] (auxiliary name: panel, popup)
  asset icon-128.png 4.64 KiB [emitted] [from: src/assets/img/icon-128.png] [copied]
  asset icon-34.png 1.84 KiB [emitted] [from: src/assets/img/icon-34.png] [copied]
asset manifest.json 823 bytes [emitted] [from: src/manifest.json] [copied]
asset 64101ebb7777441ff38a.svg 772 bytes [emitted] [immutable] [from: src/assets/img/logo.svg] (auxiliary name: newtab)
asset content.styles.css 304 bytes [emitted] [from: src/pages/Content/content.styles.css] [copied]
orphan modules 847 KiB [orphan] 662 modules
runtime modules 185 KiB 87 modules
cacheable modules 4.66 MiB (javascript) 5.39 KiB (asset)
  modules by path ./node_modules/ 4.38 MiB 474 modules
  modules by path ./src/ 292 KiB (javascript) 5.39 KiB (asset)
    javascript modules 291 KiB
      modules by path ./src/pages/ 66.5 KiB 28 modules
      modules by path ./src/helpers/ 158 KiB 11 modules
      modules by path ./src/common/*.tsx 35.7 KiB 8 modules
      modules by path ./src/state/*.ts 29.8 KiB 4 modules
      ./src/constants.ts 1.02 KiB [built] [code generated]
    asset modules 84 bytes (javascript) 5.39 KiB (asset)
      ./src/assets/img/logo.svg 42 bytes (javascript) 772 bytes (asset) [built] [code generated]
      ./src/assets/img/icon-128.png 42 bytes (javascript) 4.64 KiB (asset) [built] [code generated]
webpack 5.75.0 compiled successfully in 2749 ms

It has been stuck there for 10 minutes so I killed the process.

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.