Giter Site home page Giter Site logo

beginner-corp / slack Goto Github PK

View Code? Open in Web Editor NEW
925.0 18.0 105.0 1.13 MB

:tada:✨ Slack API client for Node and browsers.

Home Page: https://www.npmjs.com/package/slack

License: Other

JavaScript 100.00%
slack js javascript nodejs node browser api api-client api-wrapper

slack's Introduction

slack

npm Node CI coverage 93.85%

A Slack Web API client 🌱🙌💕

  • Written in modern JavaScript; tested for Node and the browser
  • Complete support for the Slack Web API
  • Perfect symmetry: JS method signatures match Web API docs
  • Choose your async adventure: all methods accept either a Node style errback or return a Promise
  • Opt into an OO style class instance that applies token to all methods
  • Well tested, CI, and Apache2 licensed
  • Only one dependency: tiny-json-http
  • Tiny: 7kb browserified/minified

Install 🌟📦

npm i slack

Usage ✨🚀

slack mirrors the published API docs exactly because its generated from those docs! The default interface are stateless functions and has remain unchanged since 1.0.0 and that will continue to be the case.

var slack = require('slack')

// logs {args:{hello:'world'}}
slack.api.test({hello:'world'}, console.log)

// :new: opt into promises
slack.api.test({nice:1}).then(console.log).catch(console.log)

Due to popular demand an OO style is supported. For an instance of Slack all methods come prebound with the token parameter applied.

const token = process.env.SLACK_BOT_TOKEN
const Slack = require('slack')
const bot = new Slack({token})

// logs {args:{hyper:'card'}}
bot.api.test({hyper:'card'}).then(console.log)

Using async/await in Node 8.x:

let token = process.env.SLACK_BOT_TOKEN
let Slack = require('slack')
let bot = new Slack({token})

;(async function main() {
  // logs {args:{hyper:'card'}}
  var result = await bot.api.test({hyper:'card'})
  console.log(result)
})()

Choose whichever style works best for your project deployment needs and team preference. ♥️🍺

Error Handling

Some methods (like slack.dialog.open) provide additional context for errors through a response_metadata object. This will be exposed as a messages properties on the errors that are thrown.

slack.dialog.open(options).catch(err => {
  console.log(err.messages)
})

Specialized Electron Support

Electron ships its own HTTP module called electron.net which can have better performance and offers more extensive HTTP proxy handling. You can opt into Electron support by passing useElectronNet:true to the Slack constructor.

import {app, BrowserWindow, net} from 'electron'
import Slack from 'slack'

const slack = new Slack({useElectronNet:true})

You can setup an HTTP authentication proxy logic by passing login to the constructor.

function login(authInfo, callback) {
  callback('username', 'password')
}

const slack = new Slack({useElectronNet:true, login})

Read more about electron.net from the source!

Test Setup 🔒🔑👈

Clone this repo and create a file called .env in the root with the following:

SLACK_BOT_TOKEN=xxxx
SLACK_CLIENT_ID=xxxx
SLACK_CLIENT_SECRET=xxxx

You can get a SLACK_TOKEN for testing here. You need to register an app for a SLACK_CLIENT_ID and SLACK_CLIENT_SECRET. The tests require the app to have the following scopes, and for the target slack to have a #test channel:

  • channels:history
  • channels:read
  • chat:write:bot
  • team:read
  • users:read

You can read about bot tokens here.

Testing 💚💚💚

👉 In Node:

npm test

👉 Or the browser:

npm run btest

Slack Web API 🎉🐝🚩

The entire Slack Web API is supported. All method signatures accept a params object and either a Node style callback (an errback) or, if absent, it will return a Promise. Required params are documented inline below.

Contributing

The code for the client is generated by scraping the Slack Web API documentation. Regenerate from the latest Slack documentation by running 🏃:

npm run generate

Portions of this README are generated as well; to make edits, update readme.tmpl and run the same command ☁️☔☀️🌻.

slack's People

Contributors

adamriaz avatar adhambadr avatar brianleroux avatar delasteve avatar dependabot-preview[bot] avatar dependabot[bot] avatar fearphage avatar html5cat avatar jimkang avatar llzes avatar matthewmueller avatar mbrevoort avatar natew avatar nvolungis avatar omariosouto avatar ryanblock avatar santoshsahoo avatar shawnhosea avatar shockey avatar tkmcc avatar yc-chen 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

slack's Issues

Specify Token Once?

Would benefit from being able to instantiate like a class, passing the token once, instead of for each method.
e.g. new Slack({ token: "..." }) as @tjhorner suggests below.

Simple code to get most recent message

Hey, I'm a bit of a beginner here. Is there any simple, sample code to help me learn to use this library? I'm build a bot with Beepboop and the Slapp framework (which uses this smallwins slack library), and I want to trying to fetch the most recent message in the current channel. So, when the user types /mybot lastmessage, it should run this code to use channel.history to pull the most recent:

slapp.message('lastmessage', ['mention', 'direct_message'], (msg) => {

  // grab the token and channel ID from the message that invoked this
  var token = msg.body.token;
  var channel = msg.body.event.channel;

  // want to use https://api.slack.com/methods/channels.history/test API call here
  ret = slack.channels.history({token, channel, 'count': 1}, (err, data) => { })

  // most recent message
  msg.say(`results ${JSON.stringify(ret)}`)
})

My code is failing on the ret = line... I'm not sure of the correct syntax to structure this. Would appreciate any guidance!

looking for example on how to post to a channel

Looking for documentation/example on how to do this:

  1. I have a Slack organization called sumanjs (sumanjs.slack.com)
  2. I have a channel in this org called "#global-command-history".
  3. I want to post messages to this channel.

This seems like the most common use case (or one of the most common) and I am struggling to figure out how to do this with your library.

I looked in the repo to see if there was an examples dir, and I didn't see anything. The readme.md seems to be the full docs and it's pretty good, but I am honestly struggling a bit to get my head around your library's API.

Any help would be appreciated!

slack.chat.update API

Hi -

I am the owner of a Slack team and have created a App and associated a bot with it.

My requirement is to update every message posted by a user on a specified channel. To achieve this - I have specified permissions - chat:write:user along with few other permissions to the App and generated Access Tokens for Bot and App after installing App to team.

Everything works fine when I post a message as it gets updated using slack.chat.update API.

But - when a new user joins a channel and his messages are not being updated by the API and I get below error - Error: cant_update_message

Could someone please help me on this.

thanks.

Missing Scope

Hello! Wanted to first say thank you about the lib and then head to the question!

I had created a bot for my team using these tools and they were working great! However, now I have to do a search on the channel and I'm stuck.

  • Missing Scope is my currently error
    image

After reading a lot online here's what I did:

  • I was using it as a custom integration, so I created an official Slack App now.
  • I updated the token that I'm using.

How's the code?

  • My "header":
// Nightmare Stuff
var Nightmare = require("nightmare");

var night = false;
var nightmare = null;

const realMouse = require('nightmare-real-mouse');
realMouse(Nightmare);

// Misc.
var request = require("request");
var fileSystem = require("fs");

//Slack Stuff
var slack = require("slack");
var env = require("node-env-file");
var path = require("path");
var bot = slack.rtm.client();

// Load Environment Variables
env(path.join(__dirname, ".env"));


// Anti-Captcha
var anticaptcha = require('./anticaptcha')(process.env.ANTI_TOKEN);

// Grab the auth token
var token = process.env.SLACK_BOT_TOKEN;
  • I connect using this:
var token = process.env.SLACK_BOT_TOKEN;

bot.listen({
  token
});

That was taken from OAuth & Permissions page from App

  • After "listening" and validating what I want, I'm calling search this way:
    slack.search.messages({token, query: name}, (err, data) => {console.log(err)});

Could you help me? I realize it's a broad issue, but I tried to provide all the relevant info's.

Thank you so much!

Uncaught TypeError: Cannot read property 'forEach' of undefined(…)

Im getting a console error constantly as soon as I send or receive a message. V. 8.2.0.
reconstruction :

import slack from 'slack'
let bot = slack.rtm.client()
const token = "123"
bot.message(m=> {console.log(m)})
bot.listen({token})

It seems here (rtm.client-browser.js:54) whenever an event is triggered on the RTM API bots, all possible events handlers are looped .forEach shoots TypeError if the key is empty/undefined in the bot.handlers object. A null-checker or using lodash _.each will avoid this error.

bot.ws.onmessage = function message(e) {
          var json = JSON.parse(e.data);
          bot.handlers[json.type].forEach(function (m) {
            return m.call({}, json);
          });
        };

message.im problems

Can't create event listener slackrtm.mesage.im

TypeError: slackrtm.message.im is not a function

--CLOSED--
use: slackrtm["message.im"](

slack.auth.revoke({}, (err, data) => { }) function not found

As of the npm module 8.3.0, the slack.auth.revoke function is not being supported.

When I log the module's functions to console, the auth object only contains the test object.
image

As of currently, I'm unauthenticating by removing all stored credentials in the database, but it'd be great to be able to unauthenticate the Slack integration when needed!

keep .env file private

Support question -

we are supposed to put an .env file in the root of our project when using require('slack'), however, if this is public info, couldn't a malicious person abuse our slack credentials?

How to mitigate this?

prepublish script makes it harder to use a fork

Not sure you'll want to address this, but right now it's hard to use a fork because the source gets build on npm publish. Not a huge deal, just sort of annoying to publish slack-2 haha.

Standard Javascript please

Your examples are unreadable to node.js. It's worse that coffee script! It looks like you just wrote sudo code

possible bug - slack.channels.history

This might not be a bug, and if it is a bug, it's probably a Slack API bug and not a bug in this lib, but maybe you can tell me if I am wrong:

this works

  slack.chat.postMessage({

    token: process.env.SLACK_TOKEN,
    channel: '#suman-all-commands',
    text: JSON.stringify({
      command: process.argv,
      config: global.sumanConfig
    })

  }, (err, data) => {
    if (err) {
      console.error(err.stack || err);
    }
    else {
      console.log('data => ', data);
    }
  });

but this gives me an error:

slack.channels.history({

    token: token,
    channel: '#suman-all-commands'

}, (err, data) => {

    if (err) {
        console.log(err.stack || err);
    }
    else {
        console.log(data);
    }

});

the error from the second script is:

Error: channel_not_found
    at _res (/home/oleg/.suman/node_modules/slack/methods/_exec.js:40:16)
    at IncomingMessage.<anonymous> (/home/oleg/.suman/node_modules/tiny-json-http/_post.js:47:9)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

How annoying is that?! :)

Same channel name, same token, and I confirmed the channel is public not private.

Any idea what it could be? Let me know if I should report it to Slack, thanks for your time.

Cannot npm install on windows

 ! Failed at the [email protected] build script 'babel src --out-dir methods && cp src/api.json methods/api.json'

cp, while a command in powershell is not one in cmd, which is the default for shell scripts

Catching rtm.client errors, how?

I'm currently using this slack module within an ionic 2 app and it is crashing whenever a user is kicked or joins a channel. Normal chat messages are being processed find. I've removed all code using this library except for

this.bot = slack.rtm.client();
this.bot.listen({ token:this.token });

while debugging the application. How can I catch this error and keep running?

TypeError: Cannot read property 'forEach' of undefined
    at WebSocket.message (rtm.client-browser.js:54)
    at WebSocket.n [as _onmessage] (polyfills.js:2)
    at t.invokeTask (polyfills.js:3)
    at Object.onInvokeTask (ng_zone.js:227)
    at t.invokeTask (polyfills.js:3)
    at e.runTask (polyfills.js:3)
    at WebSocket.invoke (polyfills.js:3)

Consider checking res.ok instead of res.error

The official Slack Web API documentation suggests:

Callers should always check the value of the ok params in the response

The _exec.js and _exec-browser.js both check for res.error instead of res.ok.

Suggestion:

  • Use res.ok to check if there should be an error
  • Send the entire res object into the error rather than just res.error
  • Don't delete res.ok in _exec-browser.js (leave res alone)
  • Consider handling both callbacks in the same manner (_exec-browser.js does a lot more while _exec.js doesn't worry about anything besides errors)
    • Preferably, handle the callback the way _exec.js does

If this functionality is wanted, I will create a PR for it.

Files:
https://github.com/smallwins/slack/blob/master/src/_exec.js#L29
https://github.com/smallwins/slack/blob/master/src/_exec-browser.js#L18
https://github.com/smallwins/slack/blob/master/src/_exec-browser.js#L28

Reference:
https://api.slack.com/web#basics
https://api.slack.com/methods/chat.postMessage#errors (or any Web API method)

add pong as a event in the rtm events

am using ping pong messages to detect the connection state with the slack , since message type pong is not in the events list so that it throws an error

Add promise support

Would love to have support for Promises rather than having to promisify manually every time we use the library. Recognize that there are issues with defaulting to a specific promise library, but this should be possible to work around by having the user specify a promise library if they wish to do so. Unfortunately, that would probably break the stateless nature of the API 👎

Opening an issue to discuss the tradeoffs (already previously touched upon here):
Issue 51

NPM build is missing new rtm events, as well as dnd namespaced functions.

Hey there,

I've noticed that the dnd namespace isn't in the npm build package, although it can be found in a local build of the project.

Also, there have been a couple new rtm events added to the Slack API. I've tested the rtm events generator script, and they are included in the output just fine.

So, to summarise:

  • package needs it's generator scripts run to update rtm events
  • take care to notice if the dnd namespace gets included in the build for npm, before next publishing

Thanks for making this module. The DX is also very nice. 👍

docs: {token} sometimes token

Just noticed for:

slack.users.list({token}, (err, data)=>)  

is actually:

slack.users.list(token, (err, data)=>)

same with slack.auth.test, and I suspect a few more.

Test case won't transpile

Having an issue transpiling to run the second usage example. Any help appreciated.

ERROR in ./~/slack/methods/api.json
Module parse failed: /Users/kamuela/Work/slack-integration/node_modules/slack/methods/api.json Unexpected token (2:12)
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token (2:12)
    at Parser.pp$4.raise (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:2221:15)
    at Parser.pp.unexpected (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:603:10)
    at Parser.pp.semicolon (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:581:61)
    at Parser.pp$1.parseExpressionStatement (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:966:10)
    at Parser.pp$1.parseStatement (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:730:24)
    at Parser.pp$1.parseBlock (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:981:25)
    at Parser.pp$1.parseStatement (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:709:33)
    at Parser.pp$1.parseTopLevel (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:638:25)
    at Parser.parse (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:516:17)
    at Object.parse (/Users/kamuela/Work/slack-integration/node_modules/acorn/dist/acorn.js:3098:39)
 @ ./~/slack/methods/_validate.js 8:11-32

Catching disconnects and reconnecting listener

Hey there! So sometimes ( not regularly ) the client just stops listening while the node script is still running. On the local mac environment I can trigger this with a wifi disconnect or going into sleep mode. On servers it also seems to happen from time to time, although they should be pretty much online 24/7.

How to catch disconnects and then restart the client?

var client = slack.rtm.client()

client.message(function(message) {
	// do something with message
});

client.listen(
	{token:sl.slacktoken}
);

// how to catch disconnects and reconnect client?

error: Error connecting to <id> Error: fatal_error

I'm using [email protected], I'm noticing the following stack trace. I'm using the RTM client to receive messages, and web APIs to post messages.

[   2016-08-24T14:38:48Z    ]   error: Error connecting to 7992c1eda6b0413f9aa2946d2b5d53d7 Error: fatal_error
[   2016-08-24T14:38:48Z    ]   at Error (native)
[   2016-08-24T14:38:48Z    ]   at Request._callback (/usr/src/app/node_modules/slack/methods/_exec.js:40:16)
[   2016-08-24T14:38:48Z    ]   at Request.self.callback (/usr/src/app/node_modules/request/request.js:187:22)
[   2016-08-24T14:38:48Z    ]   at emitTwo (events.js:87:13)
[   2016-08-24T14:38:48Z    ]   at Request.emit (events.js:172:7)
[   2016-08-24T14:38:48Z    ]   at Request.<anonymous> (/usr/src/app/node_modules/request/request.js:1044:10)
[   2016-08-24T14:38:48Z    ]   at emitOne (events.js:77:13)
[   2016-08-24T14:38:48Z    ]   at Request.emit (events.js:169:7)
[   2016-08-24T14:38:48Z    ]   at IncomingMessage.<anonymous> (/usr/src/app/node_modules/request/request.js:965:12)
[   2016-08-24T14:38:48Z    ]   at emitNone (events.js:72:20)
[   2016-08-24T14:38:48Z    ]   at IncomingMessage.emit (events.js:166:7)
[   2016-08-24T14:38:48Z    ]   at endReadableNT (_stream_readable.js:913:12)
[   2016-08-24T14:38:48Z    ]   at nextTickCallbackWith2Args (node.js:442:9)
[   2016-08-24T14:38:48Z    ]   at process._tickCallback (node.js:356:17)

Stuck in the examples.

I'm running:

> babel-node index.js

C:\Users\user\Documents\slackbot\node_modules\slack\methods\rtm.client.js:49
        if (callback) callback(err);else throw err;
                                         ^

Error: rtm.start missing params:
- token ... Authentication token (Requires scope: client)

    at Error (native)
    at validate (C:\Users\user\Documents\slackbot\node_modules\slack\methods\_validate.js:31:11)
    at rtmstart (C:\Users\user\Documents\slackbot\node_modules\slack\methods\rtm.start.js:21:36)
    at Object.botListen [as listen] (C:\Users\user\Documents\slackbot\node_modules\slack\methods\rtm.client.js:46:23)
    at Object.<anonymous> (index.js:11:5)
    at Module._compile (module.js:413:34)
    at loader (C:\Users\user\Documents\slackbot\node_modules\babel-register\lib\node.js:158:5)
    at Object.require.extensions.(anonymous function) [as .js] (C:\Users\user\Documents\slackbot\node_modules\babel-register\lib\node.js:168:7)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)

.babelrc contains:

{"presets": ["es2015"] }

index.js contains:

import slack from 'slack'

let bot = slack.rtm.client()
let token = process.env.SLACK_TOKEN 

bot.hello(message=> {
  console.log(`Got a message: ${message}`)
  bot.close()
})

bot.listen({token})

.env contains: SLACK_TOKEN=XXXX

Support for optional parameters in Web APIs.

Unable to find support or docs for optional parameters for any web API call. is this supported?

Basically I want to use reactions.add which is not possible without optional parameters.

https://api.slack.com/methods/reactions.add

This method adds a reaction (emoji) to an item (file, file comment, channel message, group message, or direct message). One of file, file_comment, or the combination of channel and timestamp must be specified.

Thank you.

Recurring connect error

Sometimes I get the error

"Parameter 'url' must be a string, not " + typeof url

when trying to start the rtm client but not all the time. Can't seem to figure out why. Anyone had this problem?

Stack trace:

TypeError: Parameter 'url' must be a string, not undefined
    at Url.parse (url.js:73:11)
    at Object.urlParse [as parse] (url.js:67:5)
    at WebSocket.initAsClient (/home/philip/Projects/Bots/wherebot/node_modules/ws/lib/WebSocket.js:572:23)
    at new WebSocket (/home/philip/Projects/Bots/wherebot/node_modules/ws/lib/WebSocket.js:78:18)
    at /home/philip/Projects/Bots/wherebot/node_modules/slack/methods/rtm.client.js:48:16
    at Request._callback (/home/philip/Projects/Bots/wherebot/node_modules/slack/methods/_exec.js:36:7)
    at Request.self.callback (/home/philip/Projects/Bots/wherebot/node_modules/request/request.js:200:22)
    at emitTwo (events.js:100:13)
    at Request.emit (events.js:185:7)
    at Request.<anonymous> (/home/philip/Projects/Bots/wherebot/node_modules/request/request.js:1041:10)

Debugger statement seems to kill process when `bot.started` handler does something sync

I don't know if this is necessarily a problem in this module, but I ran across this weirdness this morning and was wondering if you have any insight into this. To see the problem:

  1. Create a file named test-debug-crash.js with this in it:

    var slack = require('slack');
    var bot = slack.rtm.client();
    var token = 'your bot token';
    
    var userId;
    var username;
    
    // do something with the rtm.start payload
    bot.started(function(payload) {
      console.log('payload from rtm.start', payload);
    });
    
    // respond to a message message
    bot.message(function(msg) {
      debugger;
    });
    
    // start listening to the slack team associated to the token
    bot.listen({token:token})
    
  2. Run it with Node 5.2.0 via node debug test-debug-crash.js.

  3. Go over to a Slack channel that has your bot in it and type 'a' (or anything).

The process terminates without any error messages. However, if you take out the console.log, the debugger will correctly break in the message callback. If you remove the debugger statement and put back the console.log, it will not crash when a message comes in.

files.files.comments method path

This object should be:

export default {
  delete: del,
  info,
  list,
  upload,
  comments: {
    add: filesCommentsAdd,
    delete: filesCommentsDelete,
    edit: filesCommentsEdit
  },
  revokePublicURL,
  sharedPublicURL
}

In it's current form the api property for filesCommentsAdd is slack.files.files.comments.add

stdin stdout

Hi folks,

I can't access process.stdin process.stdout after bot starts listen.
I wonder how to make it?

for example this callback is never called:

process.stdin.pipe(require('split')()).on('data', processLine)

function processLine (line) {
  console.log(line + '!')
}

bot.listen({token})

How to obtain the token

I'm stuck in the basic process of obtaining a token from Slack API. I've read the docs for Slack APIs but I can only find mentions of Slack apps, which require an install from team admins.

Is there any way to get a personal token, which authenticate a request as from myself?

naming the bot?

Apologies if I missed it somewhere in the docs, but seems like when you start a bot, it's given the name bot and a default thumbnail, but when I generated the token I set the name and thumbnail.

Is there a way to specify this override somewhere in the RTM client?

slack.channels.list calls slack.channels.kick

var slack = require('slack');
var env = require('node-env-file');

env('.env');

slack.channels.list(
    {token: process.env.SLACK_TOKEN},
    function(err, data) {
        console.log(err);
    }
);
[Error: channels.kick missing params:
- channel ... Channel to remove user from.

- user ... User to remove from channel.
]

Using "slack": "^5.2.2".

Send a message with the RTM API

Sounds silly but I'm struggling with this! I have a connection, can see the channels, users, etc but I cannot send a message. What am I doing wrong?

this.bot.message({
    type: 'message',
    channel: this.state.currentChannel.id,
    text: text
});

When I do that, nothing happens :( I've also tried with a properly formatted JSON (using quotes)

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.