Code Monkey home page Code Monkey logo

twitchat's Introduction







A custom twitch chat that aims to fill gaps in the official Twitch chat for streamers.
The main goal is to follow your chat as best as possible.

For developpers, Twitchat exposes an API to receive events and control some features remotely.
📖 Read its documentation.


Features

  • Enable an emergency button with custom actions to prevent from follow bots and doxxing
  • Create your own sub/follow/rewards/poll/... alerts and chat commands with the Trigger system that allows to control your OBS sources and filters as well as Spotify when an event occurs
  • Control Twitchat and create polls or predictions with your voice
  • Read your messages and alerts out loud thank to the include text-to-speech
  • Pin messages and find them back later
  • Display the first message of users seperatly so you don't forget to greet them
  • Show any message of your chat on your stream with a single click
  • Stream Deck™ plugin
  • Custom spoiler feature so viewers can hide message contents to the streamer
  • Alert command to make Twitchat shake, blink, emit sound and display a message over everything else
  • Edit your stream's info from Twitchat with possibility to create pressets
  • Create a timer or a countdown with a simple command and show it on your stream
  • Control spotify from chat commands (create your own song request system) and show currently playing track on your stream
  • Make it easier to follow a conversation between users
  • Remember where you stopped reading the chat by clicking any message
  • Track a user to make sure not to miss their messages
  • Create a raffle and pick random winners. An overlay is available to display a wheel that selects a winner.
  • Create a bingo in which users have to find a number or an emoji
  • Ask your viewers for suggestions with a dedicated command
  • See if a user is not following the channel
  • Display received whispers and answer them
  • Filter some messages (bots, commands, self, /me, etc...)
  • Customize messages display (remove badges, show minimalist badges, remove emotes)
  • Customize messages appearance by roles (viewers, mods, vips, subs)
  • Moderate messages (ban, timeout, delete message)
  • Allow/deny messages blocked by automod
  • Display when it's the first message ever of a user on the channel
  • Display mod notifications on chat (ex: "User XXX has been banned by YYY")
  • Display sub/bits/raid/reward/follow notifications
  • Display hype train status
  • Show the last stream info of a raider
  • Integrated activity feed to see subs/cheers/follows/raids/rewards history
  • Create/Delete polls
  • Create/Delete predictions
  • Emote selector
  • BTTV, FFZ and 7TV emotes supported
  • Message autocomplete nickname via "@", emotes via ":", commands via "/" or all via TAB key
  • Allow to search on all messages via command /search
  • Split view in half with chat on left and notifications/activity feed, new viewers, etc.. on the right
  • Filter out only specific commands
  • See live viewers count
  • Keep or remove deleted messages
  • See all your followings that are live to raid them easily
  • Supports boost trains
  • Supports /announce message feature
  • Allow your mods to control your OBS scenes or mute/unmute your mic from chat
  • Expose an API to control some stuff remotely
  • Chat suggestion feature: allow your viewers to give suggestions with a dedicated command and randomly pick one of them
  • Handles "low trust" feature (more info)
  • And many other things....




Project setup

Rename the credentials.default.json file within the credentials folder to credentials.json and fill in these values :

{
	"server_port": 3018,
	"admin_ids": ["YOUR_TWITCH_USER_ID"],
	"csrf_key": "",

	"twitch_client_id": "",
	"twitch_client_secret": "",
	"twitch_redirect_uri": "http://localhost:8080/oauth",
	"twitch_scopes": [
		"chat:read",
		"chat:edit",
		"moderator:manage:announcements",
		"moderator:manage:chat_messages",
		"moderator:manage:shoutouts",
		"whispers:read",
		"user:manage:whispers",
		"moderator:read:chatters",
		"channel:read:redemptions",
		"channel:manage:redemptions",
		"channel:manage:polls",
		"channel:manage:predictions",
		"moderator:manage:chat_settings",
		"channel:moderate",
		"moderation:read",
		"channel:manage:moderators",
		"channel:manage:vips",
		"channel:manage:raids",
		"channel:manage:broadcast",
		"channel:read:hype_train",
		"channel:edit:commercial",
		"channel:read:subscriptions",
		"user:read:follows",
		"user:read:moderated_channels",
		"moderator:read:followers",
		"user:read:blocked_users",
		"user:manage:blocked_users",
		"user:edit:broadcast",
		"moderator:manage:banned_users",
		"moderator:manage:automod",
		"moderator:manage:shield_mode",
		"clips:edit",
		"channel:read:ads",
		"channel:manage:ads"
	],
	
	"spotify_client_id": "",
	"spotify_client_secret": "",
	"spotify_scopes": "user-read-currently-playing user-modify-playback-state playlist-read-private",
	"spotify_redirect_uri": "http://localhost:8080/spotify/auth",
	
	"patreon_client_id": "",
	"patreon_client_secret": "",
	"patreon_scopes": "identity identity.memberships",
	"patreon_redirect_uri": "http://localhost:8080/patreon/auth",
	
	"patreon_my_uid": "",
	"patreon_client_id_server": "",
	"patreon_client_secret_server": "",
	"patreon_redirect_uri_server": "http://localhost:3018/api/patreon/serverauth",
	"patreon_webhook_secret": "",

	"tenor_secret": "",
	"youtube_key": "path/to/key.json",
	"youtube_scopes": ["https://www.googleapis.com/auth/youtube.readonly", "https://www.googleapis.com/auth/youtube.force-ssl"],
	"google_key": "path/to/key.json",

	"paypal_client_id":"",
	"paypal_client_secret":"",

	"donors_remote_api_secret": "",
	"contact_mail": "",

	"discord_client_id":"",
	"discord_public_key":"",
	"discord_bot_token":"",

	"streamlabs_client_id":"",
	"streamlabs_client_secret":"",
	"streamlabs_redirect_uri":"",

	"streamelements_client_id":"",
	"streamelements_client_secret":""
}

Create a twitch application and fill in the client_id and client_secret values.
Write anything you want in the csrf_key field, it will be used to secure twitch authentication from CSRF attacks.
Configure the redirect URI of the twitch application to:\

http://localhost:8080/oauth

(adapt with the proper port and domain if deploying online)
Set the same value to the redirect_uri property of the credentials.json file.\

You can also create a spotify application and fill in the spotify spotify_client_id and spotify_client_secret
By default the server listens on port 3018, you can change it on credentials.json and src_front/utils/Config.ts.




Environment setup

This project has been coded with VSCode.
It is recommended to install these plugins:
TypeScript Vue Plugin: https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin

I18n-ally Plugin: https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally




Compile project

Install dependencies

npm install

Compiles and hot-reloads for development

npm run dev

Compiles and minifies for production

npm run build

Run server

node server/boostrap.js



Install server

All the following MUST be done on a seperate folder from the GIT project.
Compile the project and push the content of the server folder on your server root.
Next to this file, create a public folder and push the content of your local dist folder inside it.
Also add the credentials folder inside a data older at the root of the project.
Create an env.conf file, just write prod inside, and push it at the root of the project.
Install all the production dependencies and run the server.
Here is the expected file structure:
─ root
  ├─ node_modules/
  ├─ public/
  ├─ utils/
  ├─ data/
    ├─ credentials/
  ├─ controllers/
  ├─ bootstrap.js
  ├─ env.conf



Localization

Adding new language

Just create a new folder under the i18n folder with the ISO 639-1 code of the language.
Read the next section to know how to translate labels

Translating labels

To make localization as easy as possible, a dedicated interface has been made that lists all available categories and labels with the possibility to edit them.
Any update on this interface triggers a rebuild of the compiled file as well as an update on any twitchat page opened on the same browser.

The interface is only accessible to adminitrators and can be found here:
localhost:8080/labels
To get admin rights you must set your twitch user ID under the admin_ids array in the credentials.json file.\

Adding new labels

If you need to add new labels, you'll have to edit JSON sources.
All label files can be found under i18n folder.
They are splitted by language then by sections.
Any new file or folder structure can be added to this.
These are all merged into static/labels.json during the build process.

Files can have any name but all labels within it must be under a single property that will be the base path to use the label. The property name is usually the same as the file's name.
Example:

─ en\
  ├─ global.json\
  ├─ home.json/\
  ├─ triggers.json/\

global.json example:

{
	"global":{
		"hello":"World"
	}
}

home.json example:

{
	"home":{
		"lorem":"ipsum dolor sit amet"
	}
}

This will output this JSON file:

{
	"en":{
		"global":{
			"hello":"World"
		},
		"hello":{
			"lorem":"ipsum dolor sit amet"
		}
	}
}



Package Stream Deck™ plugin

Run the following command:

npm run streamdeck_package

The compiled plugin will be there streamdeck_plugin/fr.twitchat.streamDeckPlugin.

twitchat's People

Contributors

durss avatar griffe27 avatar kokakiwi avatar kuon avatar xdreams0 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

twitchat's Issues

Autoscroll when changing font size

Tried this on Firefox and Chrome, same thing happened.
When the text size is set to a small value (let's say up to 3-4) and there's already a lot of messages in the chat, changing the text size for a higher value triggers an autoscroll of the chat that can't be stopped. The more messages, the more it takes for the scroll to complete and scroll down until the most recent message.

Avermedia ax310 widget

hi it would be great to create a widget plugin for the avermedia live streamer ax310 as for elgato except that it brings more precisely

TypeError in parsePlaceholders

There is an exception in parsePlaceholders if the src argument is null.

It throws TypeError: can't access property "toString", n is undefined.

Also, in the above linked source, the toString() function is called twice in a row, I think the first call should be removed and a null check should be added.

I highly suggest to use an utility function like this instead of Object.toString():

function toStr(obj) { // prevent name clash even if toString should be safe
    if (obj === undefined) return null; // clean handling of undefined and null
    if (obj === null) return null;
    return Object.prototype.toString.call(obj); // ensure it has not been overriden to avoid any obscure bug
}

Unable to use the obs integration

Hello I have obs 28.1.2 with integrated websocket but when I try to link twitchat to obs (to cut stream after raid) it says I need obs28+ OR websocket 5 when I try to install WS5 it doesn't work and says the plugin can't be loaded
Is it normal ?

Add badge on viewer with stream viewing streak

Hello,

I have heard on a stream today a streamer that wanted to see on the chat as a "badge" how many streams a viewer has watched in a streak.

I directly thought to TwitchChat I think that could be something interesting.
I don't know if the badge it's the better option or instead maybe on the user infos of a viewer.

Btw, I love the job that has been done here !

Petit soucis avec les triggers

Hello et bonjour !

Tout d'abord, un énorme GG pour cet outil incroyable ! du super taff, ultra pratique avec des fonctionnalités vraiment top !

Je me permet ce message ici car je ne sais ou le mettre d'autre.
J'ai un petit soucis avec les triggers :
J'ai un trigger sur une commande chat ( !kick )
J'ai 2 actions qui s'enchainent de contrôle d'OBS
La première, rendre une source active, cette source est un fichier media
J'ai activer l'option "attendre la fin du media"
La seconde, rendre une source inactive, cette même source

Sur ma scène principale gaming, c'est nickel. Sur toutes les autres, le trigger ne se déclenche pas.
Il a eu marché c'est sur (mes modos m'ont suffisamment fait sursauté avec ce son), mais depuis 3/4 semaines environ j'ai ce comportement. Je ne comprends pas. J'ai refait mes sources, refait le trigger, rien n'y fait. La source est bien sur présente sur toutes les scènes. J'ai même essayer d'imbriquer une scène dans une scène.
Si jamais vous avez une piste pour m'aiguiller ...

Autre chose, sur les triggers toujours, on a la possibilité de faire une condition, c'est top. Mais serait il possible de pouvoir imbriquer plusieurs conditions ? (en gros pouvoir remettre une condition sur le faux ^^ )
Je m'explique, toujours sur ma commande !kick, je souhaiterais que si c'est tel modo cela controle telle source (modo 1 source 1, modo 2 source 2 etc)

Encore une fois merci pour ce fabuleux outil !

Show outbound whispers in chat

Inbound whispers can already be shown in chat:
image

However, outbound whispers, e.g. the "/w " command, aren't shown in chat.
I personally whisper to viewers a bunch and while it does work, some feedback in chat would be good since I'm sometimes not sure whether I messaged the correct person.

Sources are not moved if animation is enabled

If I create a trigger to move a source, it works only if "Animate change" is unchecked.

With "Animate change" checked, the source doesn't move, and here is the debug log from OBS:

info: [obs-websocket] [debug] [WebSocketServer::onMessage] Incoming message (decoded):
{
  "d": {
    "requestId": "484",
    "requestType": "GetCurrentProgramScene"
  },
  "op": 6
}
info: [obs-websocket] [debug] [WebSocketServer::onMessage] Outgoing message:
{
  "d": {
    "requestId": "484",
    "requestStatus": {
      "code": 100,
      "result": true
    },
    "requestType": "GetCurrentProgramScene",
    "responseData": {
      "currentProgramSceneName": "Start Scene"
    }
  },
  "op": 7
}
info: [obs-websocket] [debug] [WebSocketServer::onMessage] Incoming message (decoded):
{
  "d": {
    "requestData": {
      "sceneItemId": 53,
      "sceneName": "Start Scene"
    },
    "requestId": "485",
    "requestType": "GetSceneItemTransform"
  },
  "op": 6
}
info: [obs-websocket] [debug] [WebSocketServer::onMessage] Outgoing message:
{
  "d": {
    "requestId": "485",
    "requestStatus": {
      "code": 100,
      "result": true
    },
    "requestType": "GetSceneItemTransform",
    "responseData": {
      "sceneItemTransform": {
        "alignment": 5,
        "boundsAlignment": 0,
        "boundsHeight": 1.0,
        "boundsType": "OBS_BOUNDS_NONE",
        "boundsWidth": 1.0,
        "cropBottom": 0,
        "cropLeft": 0,
        "cropRight": 0,
        "cropTop": 0,
        "height": 84.0,
        "positionX": 58.0,
        "positionY": 100.0,
        "rotation": 0.0,
        "scaleX": 1.0,
        "scaleY": 1.0,
        "sourceHeight": 84.0,
        "sourceWidth": 1804.0,
        "width": 1804.0
      }
    }
  },
  "op": 7
}

There is no message to set the transform.

In the trigger log, I see:

4.451Animate transformation. Duration: undefined. Easing: sine.in

The animation duration was set to the default 500ms value. If I rewrite 500, then the animation works. It seems there is a problem with the default value in the form. I use firefox, and it might be why the behaviour is different.

As a side note, I see that the input is of type number. I highly suggest you do not use that.

Add font-weight and font-familty setting

Under linux, the font rendering is different and with the current settings, it is very thin (look at screenshot).

I think it would require quite some work to find some universal font setting. Instead I propose to add an advanced setting to specify font-weight and font-family css directly.

image

Make emotes be case-sensitive

BTTV, FFZ and 7TV emotes are all case sensitive, which the browser addons respect. Twitchat doesn't care for case-sensitivity, which might cause emotes wrongfully being displayed, e.g. the sentence "many ppl do something" would have the ppL global 7TV emote inserted into that.

Instruction for self hosting seems wrong

Hello,

Thanks for your work, i’m trying to self host the version, but the instruction to do it seems wrong.
In the Install server section you said : Next to this file, create a dist folder
But in the example structure

─ root
  ├─ node_modules/
  ├─ dist/
  ├─ controllers/
  ├─ utils/
  ├─ bootstrap.js
  ├─ env.conf
  ├─ credentials.json

the dist file is within the server folder, not next to it.
When the dist directory is in the server folder the directory can't be found.
But when the directory is next to the server folder its ok.

Beside this detail, when i start the server with node bootstrap.js there is no translation, only key of translation are visibles.

Minified badges too large

When the text size is set to a value of 4 or higher, the minified badges are larger than the regular badges.
Plus I've noted in my case that I have 2 badges in the chat (broadcaster + verified), and when I activate the minified badges I have 3 badges, 1 purple (sub badge I presume) + 1 red (broadcaster) + 1 purple with a white dash (verified).

Add support for 7tv emote system

Hi 👋

My request would be to have the support for 7tv emotes.

7tv is an emote system like BTTV or FFZ that adds more emotes (base limit up to 150 emotes) and it's dynamically updated

https://7tv.app

Add a enable toggle button on trigger page

On the trigger edition page, there are 4 buttons:

  • Resync rewards
  • Resync twitch extensions
  • Test trigger
  • Delete trigger

I suggest you add a toggle control to enable/disable the trigger from this page.

The use case is this: when I create a trigger "on the fly", for example "on any message", in a chat that is busy, I want to be able to test it by enabling it for like 5 seconds then turning it off, and this would be easier from the trigger page. Having to go back, find the trigger in the list, toggle it... is a bit of a usability problem.

Add custom overlays

I am currently trying twitchat to replace all my overlays, and I am missing one feature: custom overlays.

I would be great to have a custom overlay overlay, which would just be a text area for some raw code. It would be pretty low level and might be a little niche, but it would allow developers to create anything.

If you agree on the feature, I could work on it and make a PR.

A few features on the top of my head:

  • custom html/css/svg/js
  • access to all twitchat placeholders
  • can be triggered/observe values

Too many spotify requests?

I have Twitchat always openon my secondary screen (because why not...)

But look at this screenshot of my spotify application dedicated to twitchat

image

It seems that the "currently-playing" endpoint is fetched very, very, VERY often. And If think it may causes my !song trigger to add songs to the queue to fail most of the time (nothing done even if the song exists)

PS: I use the hosted version of twitchat, I don't know if the API requests are sent by the front or backend

Unable to access OBS remotely

Hi there,

It seems like any other IP than the loopback ends with an attempt to open the OBS websocket over a secure channel (on wss://) resulting in not being able to control OBS from another computer on a local network (as it seems that OBS doesn't offer the ability to set a secure WebSocket). Would it be possible to offer the opportunity to make the secure access an opt-in option instead of a default behaviour ?

Outil de sondage des raids

suggestion d'outil pour les streamers qui demandent à leurs viewers qui raider:

  • les viewers tapent leurs suggestions de la façon : !raidprop SamuelEtienne
  • l'interface twitchat fait automatiquement les stats des propositions des viewers,
  • dans les propositions, on affiche aussi le nombre de viewers des gens suggérés et si le streamer le follow déjà. Ainsi que la date du dernier raid vers ce streamer (pour pouvoir alterner facilement)

Ainsi le streamer trouve plus facilement qui raider

Overlay chat in OBS scene

Hello

Unless I am mistaken, I cannot find the chat overlay that can be placed in a browser source to display the chat to our viewers.

Does this feature still exist?

Thx for your work

Scrollbar not working on Firefox

Tried in differents tabs, works fine with Chrome but the scrollbar seems to be locked in Firefox when using the mouse. Using the Stream Deck plugin, I managed to scroll it up and down, but still not with the mouse even after that.

Windows 10 64-bit 21H2, Firefox 100.0

Multiple Twitch Accounts?

Hey :-) This project looks great. Just wondering how hard it would be to get this working with more than one twitch channel simultaneously? I have a special use case where I stream on two accounts simultaneously some of the time, kind of an experimental genre I'm trying out.

Add 3rd party emotes to emote autofill suggestions

Twitch global and sub emotes are already in the emote autofill feature when typing ":" in chat:
image

It would be awesome if 3rd party emotes could also be quickly found with the autofill feature, e.g. typing "pp" would also show 7TV's ppL in the suggestions.

Add .editorconfig

I started opening files in the project, and my editor is messing with the code automatically, especially it is triming trailing whitespace and ensuring newline at end of file, also it replaces tabs with spaces.

I suggest you add an .editorconfig file to the project to help with this.

I usually use trim_trailing_whitespace and insert_final_newline to both true, but you might set them to your liking, having the .editorconfig ensure editors of contributing developers will follow your style.

https://editorconfig.org/#supported-properties

Under linux, freetype source not recognized as text for trigger

I am trying to create a trigger that update the text of an OBS source, the source is a text source under linux but in the "Action" menu, I do not have the option to update the text.

If I use obs-websocket-js and list the items, my note item is as follow:

    {
      inputKind: 'text_ft2_source_v2',
      isGroup: null,
      sceneItemBlendMode: 'OBS_BLEND_NORMAL',
      sceneItemEnabled: true,
      sceneItemId: 40,
      sceneItemIndex: 14,
      sceneItemLocked: false,
      sceneItemTransform: [Object],
      sourceName: 'Note Text',
      sourceType: 'OBS_SOURCE_TYPE_INPUT'
    },

If I do the following call, it updates the source properly:

return obs.call("SetInputSettings", { inputName: "Note Text", inputSettings: { text: "Hello World" } }); 

Raffle winner announcement

When creating a raffle with the option "Pick a Sub", there is no announcement in the chat. There could be one too in the events column like for the classic raffle, might be useful?

Viewer count icon not showing

The viewer count icon is not showing properly:

image

There seem to be an issue with the SVG URL escaping:

image

It seems the SVG is not encoded properly with encodeURIComponent.

Implementation of translations

For now the application is English only. As community asked, it would be interesting to provide multi language support.
I did a first implementation of this translation (FR only for now) and propose my service to fully implement FR support.
Other language would be way easier to implement after this.

enhance twitchat accessibility

Although this interface looks very promising, it lacks some features to be really usable by people with disabilities, and especially blind people using screen reader.
Here is a list of issues I found regarding this topic:

  • All buttons should be labelled with what they open/do (settings for the settings button for example)
    • Within settings, there is no way to know if a box (a feature) is enabled or not: Either use a html checkbox to represent the checkbox, or, if that's not possible, you may add a "disabled" or "enabled" text alongside the feature's title, so that the information is rendered.
    • When a chat message arrives, could be nice to use a aria-live region to read it. A way to do this is using a <p role="alert"></p> and when an event occurs (such as a chat message), adds the corresponding message within this tag for about a few seconds to let the screen reader read it. after the message is read, the <P> tag can be reset to an empty content.

I'll try to see if I can create one/more PRs to enhance this. If so, they will be marked as "a11y" as it concerns accessibility.

Copy/Paste wave management

Some streamers accept (and provoke them) copy-paste waves on their chats (for example: shaunz) which makes it unreadable.
It might improve the usability and ease the management, if some detection and clustering could be done based on a string matching.

Example of implementation idea (for a better explanation of what I mean):

There is a kind of buffer of last M messages (disappear after M messages or after a given time?).
Each new message is checked against this list.

  • If it is found, a repetition counter is incremented and the disappearance mechanism is increased.
  • If the repetition count is higher than N times, the clustering occurs. It could present the initiator of the copy-paste wave and the following sheep.

The clustering itself, means removal of matching messages from the 'normal chat' into a dedicated space. This space could be a clickable 'View current Copy-paste waves' button (hidden/inactive? when no wave in progress). A click on it opens a small overlay with the list of running copy paste-waves and the interesting information.

Suggestion - Add an advanced option for chat command hide functionality

Context:

  • Some users use command with text after to troll the streamer
  • If the streamer has set a command block rule, all messages starting with the command text will be hidden.

Suggestion:

  • An option to precise if the streamer wants to hide all messages, or only those starting and ending by the command text, would be the solution
  • Technically, it should be a condition to add a regular expression anchor ($) at the end of the filtered text.
  • For the implementation, with the current UI, you could simply permit to type "$" after the command text to block, in order to enable the option. (not perfect but efficient)

Edit: typo

Error 404

Hello,

I don't know if the issue come from twitch or twitchat, but i've a error 400 when i try to authorize the link between both.I've already do an authorize few week ago without issue to test and cancel it until a new try

Thanks you for the tool

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.