GithubHelp home page GithubHelp logo

mrswitch / hello.js Goto Github PK

View Code? Open in Web Editor NEW
4.6K 4.6K 544.0 8.54 MB

A Javascript RESTFUL API library for connecting with OAuth2 services, such as Google+ API, Facebook Graph and Windows Live Connect

Home Page: https://adodson.com/hello.js/

License: MIT License

Makefile 0.03% JavaScript 89.55% HTML 1.47% CSS 8.04% Shell 0.22% Less 0.70%

hello.js's People

Contributors

aayushgoyal1 avatar crowmagnumb avatar gpetrica avatar groberts84 avatar gtothesquare avatar icereval avatar lookfirst avatar mikespock avatar moltar avatar mrswitch avatar mystery-man avatar nnarhinen avatar nolsherry avatar pasvaz avatar reynaldot avatar richardlitt avatar richguan avatar rkorn86 avatar semantic-release-bot avatar serhiiboreiko avatar sethherr avatar shanswami avatar vasken avatar visitsb avatar vuorinem avatar willbamford avatar wimpyprogrammer avatar xiaotiandada avatar xlc avatar yuryoparin avatar

Stargazers

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

Watchers

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

hello.js's Issues

hello.on events are being called twice

Hi,

I'm doing something stupid with the hello.js API, because my login and logout events (registered with hello.on) are being called twice, just with facebook login and logout. I have a button for logout, and when I call hello("facebook").logout() the logout event is called twice. The same happens with the login event.
My client is written in ExtJS, and the following code is attached to the application's initialization.

Help is very well appreciated, since it is probably my fault.

    init : function() {
        var me = this;
        hello.init({
            facebook : '1425420377699726',
            twitter : 'cYd3K2kmo3Y6MYdOFdyjrTZ5Y',
            google : '171807226739-pl2lsvoh70jeqqtkcdrqpo9j8urfdcij.apps.googleusercontent.com'
        });
        var sessionstart = function() {
            console.log('Welcome!  Fetching your information.... ');
            var api_me_error = function() {
                console.log("Whoops!");
            };
            var api_me = function(response) {
                console.log(Ext.encode(response));
            };
            hello("facebook").api("me").success(api_me).error(api_me_error);
        };
        var sessionend = function() {
            console.log("Session has ended");
        };
        // events are called twice
        hello.on("auth.logout", sessionend);
        hello.on("auth.login", sessionstart);
        hello.on("auth.failed", function() {
            console.log(arguments);
        });
    }

To login and logout, I have two buttons, with the code:

            hello("facebook").logout(function() {
                console.log("Signed out");
            });

and

        hello("facebook").login({
            scope : "email"
        }, function() {
            console.log("You are signed in to Facebook");
        });

doubt: how to keep my webapp safe?

hi,

I'm impressed and enthusiastic about hello.js, but there is something I still couldn't figure out: if the login happens client-side, what can I do in my webapp to send back to my server the authenticated login name in a safe way?

I mean, for example, if I authenticate my user on facebook client-side, would I be supposed to redirect or post the user page to something like http://mysite/authenticated?where=facebook&username=myusername

that approach would allow anybody to just type that url and be considered authenticated with that login.

I believe you have a pretty obvious solution to this problem, but I can't think on anything now.

do you have any suggestion?

Add TypeScript definition

Thanks a lot for this amazing library.

Have you any plan to provide a Typescript definition for hello.js? It simplified ids integration to large projects.

Thanks advanced

Support like/star/bookmark etc

There isn't a good catch-all but in general starring shows affinity. You can like a page but not follow, star a repo but not star it, star a flickr photo but not follow the album. I imagine that there are services that just have this lightweight gesture for archival too, but that could still fall under this model. FWIW schema.org calls this a LikeAction.

Cannot get any contacts on iPhone Safari

Happy New Year 2014 Andrew,

I just launched an online browser based multi-chat service using HelloJS on htps://www.5w1h.co/

My contacts cannot be fetched on iPhone Safari. I can go upto the step where I can grant permissions in the popup dialog (a tab actually), but after granting access, the popup never closes.

I closed it manually, still the calling page does not get any contacts. I observed the same behavior on your website too. I believe this issue needs some attention.

Security Issue!: After FB based login & then logout, user is just logged out of app but is still logged in to facebook

After user logs in to an app using helloJS through Facebook & then logs out. The log out is just from the application itself but if the user goes to facebook.com in another tab he is still logged in to facebook. This might not be expected by the users & may be a big security issue. When logging out using the facebook javascript SDK this does not happen & a proper out of the facebook account is done.

I didn't verified this scenario for other providers like google, twitter etc using helloJS.

Phonegap branch doesn't work on WP8

Using inappbrowser 0.3.3. Same project runs fine on iOS and Android.

window.open() does work on the Windows Phone. However hello().login() doesn't do anything at all. No error messages either.

Google + api - friends list - friends image picture url gives "Page not found"

Hi first of all thanks for building this awesome library!

I'm trying to show my google friends list with their picture, but only 2 images out of 100 friends actually show. For all the other requests I get a response code 404 "Page not found" or 503 "Service unavailable". This happens also for friends that I know for sure to have a profile picture.

Might be the google rest api that has changed? not sure, I wanted to point this out.

Many thanks in advance.

Connection Refused Error in localhost Using PhoneGap

Iam using PhoneGap V 3.4 and as per instruction provided by you I have configured hello.js along with phonegap based android application.
For testing purpose I am running my website at localhost with port number, I have mentioned the website url for app registered facebook as: http://localhost:8090/hellosite/redirect.html
and In config.xml of android application as redirect_uri: http://localhost:8090/hellosite/redirect.html, but on redirecting Iam getting "Application Error net::ERR_CONNECTION_REFUSED(http://localhost:8090/hellosite/redirect.html#access_token="Xyz.......123"

How can I integrate this with back-end?

Everything here is great. However, I don't want the client to receive the response directly.

I first want to send my response (redirect uri) to the Server running the client. Then can I send a response back to hello.js once the server has received this information directly from the authorization end point?

The issue I have with Client-side only communication is that there is no way for our server to authorize Client access to their own data from our server unless our Server initiates the authentication itself. But if we can initiate the authentication from the client, and give the response to the server, then the server could process that response and send it back to our client, then no one but the OAuth2 provider is giving our Server the OK to send stuff back to our client.

The most basic example

Although I have created a Google and a Facebook API, I am doing something wrong and would ask for someone to please post the entire html file required for the 'Quick Start' found at http://adodson.com/hello.js/#quick-start

This way I can begin troubleshooting and progress from a known good html file. Thank you.

UPDATE: I am looking at the profile.html demo and got it to work by supplying my app ids. I'm going to try to digest it now :)

Authentication saved in local pc

Hi,

  • First, I'm doing website to authenticate with other social networks .
    But i had problem that authenticated networked saved in current local PC .If i open it using another PC i need to authenticate again .I want user in my website save his authenticated networks and interact with other social direct not need to authenticate again.
  • Second, i want twitter send message to friends. not exist in current version
    -Third, I want send app request using Facebook to my friends.

Thanks advanced

XMLHttpRequest cannot load https://apis.live.net/v5.0/me?..... is not allowed by Access-Control-Allow-Origin.

I've been using hello.js to authenticate users of my app and it has been working just fine up until yesterday (11-JUL-2013) when it started giving me Access-Control-Allow-Origin error when trying to use https://apis.live.net/v5.0/me?. The authentication seems to work but then the code where it tries to get the user "me" details gives the error. This works fine for Google and Facebook, the error only occurs with Windows. I commented out the following to force it to use JSONP and it works with JSONP:
// Can we use XHR for Cross domain delivery?
/*if( 'withCredentials' in new XMLHttpRequest() && ( !("xhr" in o) || ( o.xhr && o.xhr(p,qs) ) ) ){............

So the problem seems to be with Live connect XHR.
The error also occurs when using it from http://adodson.com/hello.js/ so I'm pretty sure it's not my code or setup, as I said, this worked fine up until yesterday.

My project is only in development so there are no production issues for me and I have a workaround (to use JSONP) in dev but you may want to look into it.
Thanks,
Peter.

Upload photo via URL

Hey,

I love your script but i have problem wtih uploading photo via url. I tried everything :(
I only can do it with php, but i like your way so much , i will be glad if you show me how to do it.

Thanks
Jacek

//edit

i just change file to url in upload.html example and it works :)

auth.login event handling

Hello,

I would like to use a google authentication on my website and handle a 'auth.login' event, but I only get redirected to the 'redirect_uri' with no events firing whatsoever.

I used this code

    hello.on('auth.login', function(auth){

        // call user information, for the given network
        hello( auth.network ).api( '/me' ).success(function(r){
            var $target = $("#profile_"+ auth.network );
            if($target.length==0){
                $target = $("<div id='profile_"+auth.network+"'></div>").appendTo("#profile");
            }
            $target.html('<img src="'+ r.thumbnail +'" /> Hey '+r.name).attr('title', r.name + " on "+ auth.network);
        });
    });

About redirect uri

What is the use of redirect_uri. i have downloaded the source code.but they are not working.what should we keep the redirect uri in our local machine's code.If i try to use that i am getting some error.ihave attached a screen shot.please help me
Capture

feature request: implement "new" ajax methods

First up, really nice plugin!!

I was wondering, if it was possible to not only support the depreciated success and error handlers as possible responses of requests being made?

If you look at jQuery ajax, then, fail, always and done should also be available in my opinion. This way you could hook up the calls to helloJS in a promise/deferred chain.

I modified your callbacks to this:

    this.success = this.done = function(callback){
      return this.on("success",callback);
    };
    this.error = this.fail = function(callback){
      return this.on("error",callback);
    };
    this.complete = this.always = function(callback){
      return this.on("complete",callback);
    };
    this.then = function(callback) {
      if(callback.network) {
        return this.on("success",callback);
      } else {
        return this.on("error",callback);
      }
    };

Which seems to do the trick, so I'm able to call:

                    hello(auth.network).api( "/me" )
                      .then(function(r) { console.log(r)})
                      .fail(util.errorHandler);

This also takes care of multiple Ajax requests being issued, which I sometimes run into.

Let me know if I should do a PR.

Thanks and keep up the good work!

Could not fetch friend email address in windows api

Although, we are getting other details of friends contact's email field is always fetching null result only.

Please check http://www.vigvan.com/friends.html

While searching the case I saw Live api docs and found that wl_email scope needs to be added for fetching wl_contactsemail

I have already added all scope for the friends page, then too its not working.

Please provide some solution asap.

Thanks and regards,
Irfan Memon

LinkedIn SAMEORIGIN iframe issue

I keep getting this error when trying to open the LinkedIn auth dialog just like i would any other provider with hello().login

Refused to display 'https://www.linkedin.com/uas/oauth2/authorization?client_id=75opk4gunsuzbi&โ€ฆ%3A%22https%3A%2F%2Fwww.linkedin.com%2Fuas%2Foauth2%2FaccessToken%22%7D%7D' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

scope = manage_pages

I want to do a post on the wall of a fan page on facebook. (/me/feed)
I modified the module facebook.js adding 'manage_pages' scope and method '/ me / accounts'.
In the session token is stored on the user and not the fan page.
With the method '/ me / accounts' get the token to manage the fan page, but I can not change the access token that is stored in the session hello.js, this is the token for the user and not the fan page.
Is possible to change the user token by token fan page?

thank you very much
regards

invalid_credentials, twitter

Hello, I'm trying to make twitter authentication work. it's the same error as #12 but I quite not understood what I need to do to solve it.

I have the code below with twitter equal to the 'Consumer key'

hello.init({
    twitter: 'JBS5hj0dFjLVHUg9FESajA'
}, {redirect_uri: 'redirect.html'});

when i do a login i got the error in the popup window:

http://autoauth.com/redirect.html#error=invalid_credentials&error_message=Credientials%20were%20not%20recognised&state=%7B%22client_id%22%3A%22JBS5hj0dFjLVHUg9FESajA%22%2C%22network%22%3A%22twitter%22%2C%22display%22%3A%22popup%22%2C%22callback%22%3A%22_hellojs_1nw2jq9v%22%2C%22state%22%3A%22%22%2C%22oauth_proxy%22%3A%22https%3A%2F%2Fauth-server.herokuapp.com%2Fproxy%22%2C%22scope%22%3A%5B%22basic%22%5D%2C%22oauth%22%3A%7B%22version%22%3A%221.0a%22%2C%22auth%22%3A%22https%3A%2F%2Ftwitter.com%2Foauth%2Fauthorize%22%2C%22request%22%3A%22https%3A%2F%2Ftwitter.com%2Foauth%2Frequest_token%22%2C%22token%22%3A%22https%3A%2F%2Ftwitter.com%2Foauth%2Faccess_token%22%7D%7D

A website is running locally on my computer.

What am I doing wrong?
I tried with both hello.min.js and hello.all.min.js, with no luck.

How to add scope correctly?

I'm trying to add my custom scope for google coordinates, but it just doesn't seem to work, whe i check the web traffic, i can see the basic scopes parameters but not my coordinates scope url, i have already tried different things

example:

hello.init({
google : xxxxxxxxxx'
},{redirect_uri:''},{scope:'https://www.googleapis.com/auth/coordinate'});

also

hello( 'google' ).login(scope:'https://www.googleapis.com/auth/coordinate')

Any help with this?

Other than that, this library rocks, i only had to spend a few minutes on the page to learn how to use it, this library is great!

Instagram not working on IE8

IE8 receive error when trying to login with Instagram, after login in popup the IE8 has this issue.

Webpage error details

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
Timestamp: Fri, 30 May 2014 01:27:12 UTC
Message: Function expected
Line: 871
Char: 4
Code: 0
URI: hello.js

This is the code in question: return data instanceof window[test];

Twitter share usage

On your twitter demo page, I logged in with the button and tried hello.api in firebug console. I am able to get the response for

>>> hello.api('/me',function(r) {console.log(JSON.stringify(r));})

and able to see the response object in console.
While '/me/share' doesn't seems to work, here is the cmd

>>> hello.api('/me/share','post',{message:'Hi to all'},
  function(r) {
    console.log(JSON.stringify(r));
})

for above reques the response is

{"errors":[{"code":170,"message":"Missing required parameter: status"}]}

while I see in the Post data as

status=Hi%20to%20all

and Params are

access_token    1690287512-eB8IocvynmqSmnMlpxoh0VBJxWhff86sYHTBqKo:DRT4zO8pTbMjY8yblG9RtSqRMD3oKEyP8kAGG6cpo9w@eQuyZuECKWPiv3D7E4qdg
path    https://api.twitter.com/1.1/statuses/update.json?include_entities=1

So how should I use properly the twitter share api?

Specify the callback dataType

It there's any way I can set the dataType for my callback at hello.login()? Because for some apps Im developing, i need to return it as JSON to my callback url.

Thanks in advance

Linkedin sharing

According to this, LinkedIn allows status updates via JS. I attempted to uncomment the post init function in linkedin.js but to no avail. Is the issue that LinkedIn formats their JSON requests differently than the others? I am hunting for a solution, curious if there was a reason LinkedIn status updates are omitted.

Not able to login twitter

I included the hello.js in my site and tried google and twitter. Able to login with google but there is some issue with twitter. I have created the consumer key on twitter for my site and using this as ClientId in init like

hello.init({'twitter': 'my site consumer key'})

But when i click the login i get the error in callback url

error=invalid_credentials&error_message=Credientials were not recognised

where am I doing wrong, please suggest me.

Gagan

Cannot query Twitter APIs after HTTPS switch

Hi,
recently Twitter moved to HTTPS. So using Hello.js I'm always getting a 400 Bad Request while trying to login and querying the APIs.
Can you please address this issue?

Thanks

Manually set access_token

Hello

I obtain Facebook access_token with another library. I'm wondering if I could somehow pass access_token to hellojs and only use it's functions? I only interesting in posting and uploading photo. But because of limitations, I'm not able to use built in auth.

Thank you

Can't sign-in to Google when photo isn't available

Console error on Chrome: Uncaught TypeError: Cannot read property 'url' of undefined (hello.all.min.js:7)

This happens when the user's Google account does not have a photo - problem exists on hello.js official site too.

Can't connect with Twitter

I am trying to use twitter and followed all steps, included my app_id in the hello.init, but when I click in Twitter button it opens a popup with the following url error:

http://myappawesomeness.com/login#error=signature_invalid&error_message=Your%20application%20needs%20to%20be%20registered%20at%20https%2F%2Fauth-server.herokuapp.com

I saw in your examples with Twitter you use:

var TWITTER_CLIENT_ID = {
'local.knarly.com' : 'krGNvpEVVBE27jcemC6uA',
'adodson.com' : 'eQuyZuECKWPiv3D7E4qdg'
}[window.location.hostname];

Is there anything I have to do to connect with Twitter and I am missing it?
Thanks in advance and congratulations for the awesome project.

By the way the 3 default networks are working quite well.

If you add custom "state" to .login you get a multilevel state object sent to the server.

Here's what I'm seeing on my server end when I pass a custom "state" to the server:

Parameters: {"client_id"=>"nepvvi6x5ecegqys6e32bob4bf2vzjb", "response_type"=>"token", "redirect_uri"=>"http://teamclockjs.payrollhero.dev/", "display"=>"popup", "scope"=>"write_schedules read_schedules", "state"=>"{\"client_id\":\"nepvvi6x5ecegqys6e32bob4bf2vzjb\",\"network\":\"payrollhero_dev_schedules\",\"display\":\"popup\",\"callback\":\"_hellojs_8db6uu1v\",\"state\":{\"require_account_id\":1},\"oauth_proxy\":\"https://auth-server.herokuapp.com/proxy\",\"scope\":\"change_schedules,basic\",\"oauth\":{\"version\":2,\"auth\":\"http://teamclockmanagerauth.payrollhero.dev/oauth/authorize\",\"grant\":\"http://teamclockmanagerauth.payrollhero.dev/oauth/token\",\"logout\":\"http://teamclockmanagerauth.payrollhero.dev/oauth/logout\"}}"}

Seems that the "state" ends up within "state" again. This is very confusing.
I note here's the problem:

//
        // QUERY STRING
        // querystring parameters, we may pass our own arguments to form the querystring
        //
        p.qs = {
            client_id   : provider.id,
            response_type : opts.response_type,
            redirect_uri : opts.redirect_uri,
            display     : opts.display,
            scope       : 'basic',
            state       : {
                client_id   : provider.id,
                network     : p.network,
                display     : opts.display,
                callback    : callback_id,
                state       : opts.state,
                oauth_proxy : opts.oauth_proxy
            }
        };

Really the state object needs to merge these into the passed in state.

I have some solutions to the new FB Graph API v2 friends issue

This applies to all apps created after May 1st and apps that have migrated to the new Facebook Graph API.

Recently due to Facebooks new graph api that was released April 30th some new rules have been made that restrict access to a users friends list. Now the required scope user_friends is required. Also as a result even if a user grants this permission, the only friends that will be shown are friends that are also using the same app, for example a person who plays Clash of Clans can only see friends who are also playing Clash of Clans

There are some upsides, GAMES ONLY utilizing Canvas Games in Facebook are allowed to get an me/invitable_friends however this is for approved games only.

Even though this is a major disadvantage to developers now i have found one way to at least get some of the users friends, being all the users family members, this requires going to the me/family and having the scope user_relationships added.

This is more a solution then a issue really. I propose HelloJS users use

hello("facebook").api("me/family", "get", {limit: 100}, function(json){console.log(json);});

However even with this it does not format the response with a user thumbnail so im not sure how to resolve that part.

Any other feedback and solutions is greatly appreciated as far as the thumbnail goes

EDIT: i wanted to add this link for reference because i think it may help us build a VIEWABLE only list of friends, however we would not be able to do anything else but have a list of friends, couldn't invite them to the app, could possibly do a share this app with friends thing and do a share api post coupled with this me/taggable_friends endpoint just a random thought though. But the app has to be approved to use this endpoint so Facebook not might light that very much. I suppose as long as the user understands they are sharring the app publicly and tagging those friends they should not have a problem but who knows. Facebook's lame now a'days but we put up with them because mass amount of the world uses it. Anyways, heres the link
https://developers.facebook.com/docs/graph-api/reference/v2.0/user/taggable_friends/

SSL certificate necessary?

First question: What is the exact name of the Google API you use for connecting through Google's service?

Second question: Is an SSL certificate necessary to get this plugin to work?

I've not been successful at installing this plugin using either Google or Github, even after obtaining client ID's. I would love to utilize this wonderful software, but I'm hitting a brick wall.

401 (Token invalid - AuthSub token has wrong scope)

When trying to access any network's API (other than "me") the server returns back a 401 Token invalid error. While searching about this error returned that the scope of the request is basically not right.

I am able to reproduce it consistently for all networks (g+, twitter, facebook) for anything other than hello("network").api("me") call. Is this is a known issue or am I missing something?

Flickr module

I'm trying to add the Flickr module, I managed the authentication part, however as far as I understood, flickr has no profile url for the 'me' api, we should issue a call to http://api.flickr.com/services/rest/?method=flickr.people.getInfo&user_id=XXX where XXX is the user id of the logged user. In order to get the user_id it's necessary a previous call to method=flickr.people.findByUsername&username=YYY where YYY is the user name that can be grabbed from the authorization process:

I don't need the flickr access, I'm doing this just for fun so my knowledge of flikr is very poor, I didn't even have an account before and I'm wondering if all this process is correct and worths this effort, so any help will be appreciated.

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.