Giter VIP home page Giter VIP logo

opensteamcontroller's Introduction

Open Steam Controller

Welcome to the Open Steam Controller Project!

This is a project where I have been working to deconstruct, document, repurpose and expand upon the Steam Controller firmware and hardware.

The Steam Controller

First, it is important to talk a little about the Steam Controller (the hardware that this project is focused on).

SteamControllerBox

The Steam Controller is a video game controller released by Valve Corporation on November 10, 2015. This was part of Valve's initiative to give PC gamers the option of a console-like experience (i.e. the couch gamer who sits in front of a TV and uses a controller instead of keyboard and mouse).

SteamControllerFront

The Steam Controller tried to keep some aspects familiar to modern video game controllers (i.e. a left analog stick, four face buttons, two shoulder and bumper buttons) while also changing up some of the norms we have come to expect (i.e. replacing the directional pad and right analog stick with trackpads).

SteamControllerBack

Additional details on the controller can be found on the official Product Page

Why?

You may be wondering why this project exists and why I have invested a non-negligible amount of my time and energy into it over the past couple of years.

First, I found the design of this controller to be compelling. Having two trackpads in place of the D-pad and right analog stick is an interesting idea. The trackpads can be configured to act in a variety of ways and not only mimic what they replaced, but also provide new interaction paradigms. Also, the idea of using the haptics to play a little Jingle when the controller starts up or shuts down is a neat touch that made the controller further stand out. Being able to fully customize these Jingles was a near immediate desire when I first started using the controller.

Second, the controller was left fairly accessible. Being able to upload firmware updates manually made the barrier to entry for running custom firmware much lower. There was still a considerable challenge to get even a "Hello World" (i.e. blink the Steam Button LED) working. However, this was not nearly as tough as I imagine doing something similar on a controller that is designed to be more temper resistant would be. I really appreciate the fact that Valve left this hardware as accessible as they did and do not discourage people from trying to hack it.

Third, iFixit did a really nice teardown of the controller. This gave me an idea of what the controller had going on internally, without needing to (initially) take apart my hardware. This pointed out a lot of neat peripherals and processors that I thought would be neat to work with, especially in the context of a product that already was designed for a particular purpose.

The Open Steam Controller Project

Now that the controller and some of its (default) capabilities have been explained, we can start talking about this project. Namely I want to cover what has been accomplished, and what I hope to accomplish moving forward.

Note, the following is a bit verbose and narrative. There is a lot of content in this project and this is an attempt to break down the details in a way that will give an easy to follow lay of the land for people new to this effort. If you are a TLDR kind of person, check out the Notice and Warning Section below and then feel free to jump into the Subprojects Section to get to the meat of effort. You should also be sure to check out the demo videos that show some of the major accomplishments in action.

As mentioned previously, the primary intention of this project is to explore, deconstruct and expand upon configuration options and usages for the Steam Controller. However, that is a bit vague. So let's start with some examples. First, a major goal of this project was to be able to write custom firmware for the main processor on the controller. This is what opens up the door for a lot of other possibilities moving forward.

However, before I could start writing firmware I needed more info on the controller. Valve was nice enough to leave the door open to accessing the binary version of their firmware and the ability to update the main processor easily. However, they did not provide schematics or a list of components or datasheets that an embedded software engineer would typically have if tasked with the process of writing custom firmware. Therefore, I needed to turn to reverse engineering. This essentially boils down to deconstructing the hardware and official firmware so that I could understand how to write my own firmware. At this point the Reverse Engineering effort has mostly run its course, as a lot has been discovered, documented and utilized for other efforts. Details on the Reverse Engineering effort can be found in the Reverse Engineering Subproject.

Now that a Reverse Engineering effort has been established and I have started gathering information on the hardware, I was able to start writing custom Firmware. Check out the Firmware Subproject to see the current state of software. Mostly this is utility software to allow a user to query different peripherals or take measurements at different states (as some of that information needed to be captured and fed back into the Reverse Engineering process to keep it moving forward). However, it eventually became clear that there was enough functionality that was captured here that it would not be too much additional work to make this hardware act as a controller for other consoles (i.e. the Nintendo Switch).

Next we come to what was originally the sole intention of this project. That is, the goal of being able to have full control of the songs (Jingles) that the Steam Controller plays (via the Trackpad Haptics) on power up and shut down. Due to some discoveries via the Reverse Engineering effort, this project allows for Jingles to be fully customized and for these customizations to persist while still running Valve's official firmware. For details on how to customize the Jingles on your controller, or for more details (i.e. how Jingle Data is formatted and how we can customize Jingles without modifying the official firmware) see The Jingles Subproject.

Finally, it is important to mention that another intention of this project is for it to to be an educational and/or motivational resource. Maybe you are interested in the Steam Controller. Or maybe you are interested in writing embedded software for a commercial device. Either way the hope is for this project to provide clear and concise information to inspire and enable people to to learn and do more. I know I learned a lot from this effort, and if any of that can be shared and help others out that would be great.

For a starting point on additional details and the accomplishments and future intentions of this project please see the Subprojects section below.

Notice and Warning

Please recognize that by utilizing any part of this project you are doing so at your own risk. This is a reverse engineering effort and I make no claims to have a complete understanding of the hardware I am providing custom or modified firmware for. Hopefully the testing I perform before publishing my findings and modifications will prevent damage to your Steam Controller or anything you may connect your Steam Controller to (i.e. the Nintendo Switch). However, I cannot guarantee that.

Also please note this is being shared primarily for educational purposes. While this may allow a user to do things such as use the Steam Controller on the Nintendo Switch, please recognize that this is almost definitely going to be coming with trade-offs compared to officially supported hardware and firmware. If you want a cheap Switch Controller and are OK with it being wired, check out the ones PowerA or Hori makes. If you want a fully featured controller, consider spending the extra money and get a Pro Controller (it really is worth it).

Finally note that I say all of this with the hope of not discouraging anyone. Please dive in and get your hands dirty. Just please be aware that there is a (hopefully) very small, but non-zero, chance that a mistake could lead to bricked or broken hardware.

Subprojects

This section gives brief outlines and demonstrations (if applicable) of the major efforts of this project. Further details on each Subproject can be found in their respective directories.

The work in this directory is geared towards creating a completely custom firmware build for the Steam Controller. This project can be configured to have the controller act as a development system that allows for querying peripherals and exploring or verifying system behaviors. Additionally the project can be configured for more practical purpose, such as behaving like a wired Nintendo Switch controller.

Below are some videos demonstrating the different firmware builds:

Open Steam Controller: Nintendo Switch

Open Steam Controller: Nintendo Switch

Open Steam Controller: Development Board

Open Steam Controller: Development Board

The work in this directory is geared towards creating a user friendly way to customize what Jingles are played when the Steam Controller starts up and shuts down.

Below is a video demonstrating how to customize Jingles on the Steam Controller:

Open Steam Controller: Jingle Customization

Open Steam Controller: Jingle Customization

The work in this directory focuses on deconstructing the firmware and hardware of the Steam Controller. The understanding gained from this often is a
significant part of the other Subprojects.

Steam offers the ability to change certain configuration options for a Steam Controller (i.e. change LED brightness, change which Jingle will be played from system memory). This directory contains work for understanding, reproducing and, maybe, expanding upon this functionality.

Contributing

This is an open source project, so please make use of this however you would like (as long as it does not violate any licenses stated within).

If you would like to offer contributions back to this repo that would be great. That could come in the form of issues/discussions on how this could be more user friendly or by adding features or support that is not yet there.

Note that there are TODO documents for each Subproject. The idea is to outline goals I would like to accomplish. If you want to help with any of these that would be awesome. It would be even more awesome if you started a conversation regarding your intentions so as to limit the chances of duplicated effort or incongruous designs.

Bugs and Issues

I will do my best to provide easy to use and robust software. However, there will still most likely be bugs. If you find a bug, please report it.

The best way to report a bug is to use the Issues tab on GitHub.

When reporting a bug/issue, please make sure to provide sufficient details. Key details to include are:

  • Exactly what steps did you take?
  • Can you reproduce the error by following your own steps?
  • Do you have any files that make the bug occur (i.e. specific .musicxml file)?

Resources and Influences

This section lists some projects that influenced this project, as well as links to some resources that may continue to be helpful to stay current on.

  • Example of using the haptics to play music.
  • Example of PC side code written in C using libusb.
  • Allows for playing songs of any length, but at cost of controller being occupied by Singer software.
  • Application for communicating with Pro Controller via USB HID.
  • Helpful for Switch Faux Controller development to get USB communications in place.
  • Notes on Reverse Engineering of Nintendo Switch Controllers.
  • Helpful details on HID communications with Pro Controller.
  • Source for breaking down some USB commands.
  • Goal of this project is to be able to use Steam Controller as a game controller outside of the Steam platform.
  • Useful to get an idea of what changed from official firmware to firmware release.
  • Step by step guide on how to manually change the Steam Controller firmware.
  • Much of this information is captured in Loading Firmware.
    • Loading Firmware presents the information in the context of how it applies to Open Steam Controller Project and its Subprojects.

Steam Communities

TODO

While a lot has been accomplished in this project thus far, there is still so much that can be done with the Steam Controller (especially given the groundwork that has been laid up to this point). In order to capture and track these ideas TODO documents have been made for each Subproject. A good place to start is the top-level TODO Document. This covers the highest level goals for the project while providing links to Subproject specific TODOS.

opensteamcontroller's People

Contributors

greggersaurus avatar rigidsh 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

opensteamcontroller's Issues

Switch console unable to calibrate sticks

Of my three Steam controllers, only one has a left stick that works properly with the Switch firmware. One stick is miscalibrated to point slightly downwards when in resting position, and the other momentarily jitters upwards when held downwards. I have not noticed these issues while playing Steam games. The calibration menu in the Switch settings could solve my problems, but it opens a dialogue:

Stick calibration is not currently supported for this device.
Calibration may be possible after a system update.

Bluetooth on fauxcontroller

Is it possible?
EDIT: actually, would it be plausible to merge parts of the OSC firmware into this to adjust settings while plugged into a pc?

Bricked Steam Controller?

Hello!
I'm trying to restore the original firmware which I backed up before adding the Nintendo Switch firmware.
But my device does not show up anymore in Windows 10 when starting as instructed (Holding down Right trigger and plugging it in).

Help?

Switch pro steam

If i use OpenSteamControllerNinSwitch.bin steam should detect controller?

Edits to Right Touch Pad

Hello, I'm new to GitHub so please forgive me if this isn't the right way to communicate this. I'm trying to figure out how to get into the firmware code because I would like to make an edit to the trackpad sensitivity on the right. I'm not quite sure how to describe what I mean, but basically the trackpad is far to sensitive and reacts without me touching the trackpad.

Ghidra RE of the bootloader

Hey all,

I've been working on my own custom firmware for the Steam Controller, heavily helped by the documentation found here, but also by my own reverse engineering. In doing so, I have done a complete RE of the "bootloader" portion of the firmware (the first 0x2000 bytes of the official firmware) in Ghidra, and an (almsot) complete reimplementation in https://github.com/h1k421/steam_controller_custom_firmware/blob/master/bootloader (There are a couple small functions missing/commented out, but it's complete enough to boot a working firmware, and allow Steam to interact with it, do firmware updates, etc...).

I was wondering if you were interested in the RE database, and if so, where it should be PR'd to? Ghidra databases can be exported as a zip file (ideally) or as an XML (not as good, loses some information, but still relatively functional).

Furthermore, if anyone else is interested, I'm working on a similar complete RE of the rest of the firmware (with the similar goal of doing a complete, faithful reimplementation). The RE is done on a ghidra server, if anyone's interested in helping out, feel free to reach out by email at [email protected] or on the megaton-hammer discord.

(I really hope this doesn't come across as rude or intruding ^^').

Hd rumble converter

Hello,the SteamController has the same technology for rumble as Nintendo Joycon and Nintendo Switch Pro Controller : linear resonant actuators.
It could be seen of several ways,but maybe the most interesting is a kind of "speaker" which could emulate textures,sensations..
One the best uses could be seen on the minigames from 1 2 Switch,in concrete the Kazuate game (ball counting)

It would amazing could port the files between the diferent formats. (They are more devices which use the tech and others which would be released as the dualshock 5 for playstation 5 next year).

The Steam Controller has them on their rom according this web

The Nintendo format is called "bnvib" and it has been reverse enginering.
it is created with a program than Nintendo included on their SDK using a wav file .Also,son same cases, they use an extra file on a format called "nvibcp" which give some description of how the sound must be converted.
I only has been seen this file once time while reverse enginering the minigame kazuake ,in concrete it seems was used to create the file "Kazuate_VIB_Rolling2_SlowReverse.bnvib".

Ctcaer also create the format "jcvib" which is the bnvib expanded ,as the controller is able to understand it directly.

According to Ctcaer :

"
The vibration data is encoded so every frequency and amplitude fit into a byte that joy-cons understand.these files are not sent to the joy-cons.They are parsed in the console,
Anyway, these files are not sent to the joy-cons .They are parsed in the console,decoded and sent to Joy-Cons re-encoded in a format they understand.
So this is real-time, not preloaded. .
Each packet sent to joycon can have maximum 8 bytes of vibration data. 4 for each one (left/right).

.bnvib is the official format and keeps the vibration into 4 uint8.

.jcvib is my coined format and it's raw. 4 uint8 that the controller can understand right away.

Ctcaer also checked the SteamControllerSinger and it's similar on what to do.
The only difference is what raw commands each controller understand and the frequency bandwidth of these.

Joy-con bandwidth is small:
Low freq band:
40.875 - 626.286Hz
High freq band:
81.751 - 1252.572Hz

So that's why you need to transport the notes to lower octaves until you are inside the range and then separate bass-mid and mid-high notes.

I can easily convert the frequencies but the amplitudes need a look up table,
because I haven't reverse engineered the algorithm behind it.

The encoding algorithm for frequency is -32*(log(2)-log(freq/5))/log(2)

The algorithm for amplitude is splitted in 3 range indexes (idx < 16, 16 <= idx < 32, idx < 128) and it's currently undecoded.

The amplitudes below are not safe for the integrity of the linear resonant actuators.

"
Here i post the links where i found the info (Also give thankd to CTCaer for give some explanations directly)

https://gbatemp.net/threads/tool-joy-con-toolkit.478560/

https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering

https://github.com/CTCaer/jc_toolkit

https://gbatemp.net/threads/tool-joy-con-toolkit.478560/

Support for Bluetooth

Not sure if there are plans for this already, but support for bluetooth would be awesome to see, especially for other with the switch lite. I know there is support for the BLE mode on the sc-controller project, that was rolled out after Valve rolled out the BLE mode.

Room for good space savings with MusicXML

Tied notes end up as multiple separate notes (which actually ends up sounding different), rests aren't combined into one (just a waste of space), trailing rests aren't removed (same). Leading rests can also often be trimmed, but not always. Lots of room for easy condensing it down, which is extra important since we only got 1024 bytes to work with.

I tried hand-condensing my own collection of jingles. If you're hard pressed for space it's enough space to squeeze another jingle in. Savings are pretty decent. Over 12 songs I saved 120 bytes if I did my math right. Down to 972 from 1092, enough to get the existing songs under 1024 and enough to even add another on top of that.

Gonna try poking around with this over the next few days but I've never messed with C++ specifically so we'll see how far I get with that.

[Question] Possible to create XInput firmware?

I'm completely new to this, so forgive me if I sound stupid, but is it possible to create a faux Xbox Controller so the SC could work as a system-wide XInput controller? If it is, how could I do this? Has anyone created one yet?

Document HID Controller Interface protocol

This is an issue to gather information about the HID Controller Interface protocol, as described here.

Look at #25 for my current progress.

Old information The HID Controller Interface is interfaced either via Firmware USB EP3 , Bootloader USB EP1, or via some currently unknown wireless mechanism. It works by transferring buffers of 0x40 bytes. The first byte is a packet id, while the second byte is the length of the additional data. Here is a packetid table containing both bootloader and firmware packets as of 57bf5c10.

Host->Controller:

Packet ID Name Controller Bootloader Controller Firmware Dongle Description
0x80 ⛔️
0x81 ExitLizardMode ⛔️ Exits the "lizard mode" - Tells the steam controller to acting like a dumb keyboard/mouse combo. Might need to be sent periodically?
0x82 ⛔️
0x83 ControllerInfoRequest Asks the controller to send its ControllerInfo.
0x85 ⛔️
0x87 SetSettings ⛔️ Sets the controller settings
0x89 ⛔️
0x8d ⛔️
0x8e ⛔️
0x8f TriggerHapticPulse ⛔️
0x90 ReinvokeISP Reinvokes the LPC ISP Firmware (ISP being what happens when you boot while holding the right trigger). Seems to also work on the dongle?
0x91 EraseLPCFirmware ⛔️ Erases the LPC firmware.
0x92 FlashLPCFirmware ⛔️ Flashes a chunk of LPC firmware.
0x93 VerifyLPCFirmware ⛔️ Finishes flashing the LPC firmware, and validates it against a checksum.
0x95 ResetSOC Restarts both LPC and NRF CPUs.
0x96 SetPrngEntropy ⛔️ ⛔️ Sends a block of 0x10 random bytes to the device.
0x97 EraseNRFFirmware (Supposedly, no RE) Erases the NRF Firmware
0x98 FlashNRFFirmware (Supposedly, no RE) Flashes a chunk of NRF Firmware
0x99 VerifyNRFFirmware (Supposedly, no RE) Finishes flashing the NRF firmware, and validates it against a checksum.
0x9a ⛔️ Sends data to the nRF chip, wrapped in a packet ']'.
0x9f TurnOffController ⛔️
0xa7 CalibrateTrackpads ⛔️
0xa9 ⛔️
0xa0 SetHardwareVersion ⛔️ THIS COMMAND IS EXTREMELY DANGEROUS
0xaa ⛔️
0xab ⛔️
0xac ⛔️
0xad SetDonglePairingMode ⛔️ ⛔️ 2 byte args
0xae ControllerInfoRequest ⛔️
0xb1 SetControllerKeyboardMouseInputState ⛔️ ⛔️
0xb2 PairingFailed ⛔️ ⛔️
0xb3 PairingSuccess ⛔️ ⛔️
0xb4 GetControllerInfo ⛔️ ⛔️
0xb5 CalibrateIMU ⛔️
0xb6 PlayAudio ⛔️ Plays the selected jingle
0xb7 StartFlashJingle ⛔️ Does something weird with the jingle_data_ptr 👀
0xb8 FlashJingle ⛔️ Writes data to the jingle flash buffer
0xb9 EndFlashJingle ⛔️ Finishes flashing a jingle, writing it to eeprom after making sure it looks somewhat valid.
0xba GetChipID ⛔️
0xbb ReadUID ⛔️ Returns the result of ISP ReadUID.
0xbf CalibrateJoystick ⛔️ Sets eeprom field 0x34 with some computed data
0xc1 SetAudioMapping ⛔️ Sets the jingle to play for various events
0xc5 SetUserLedColor ⛔️ ⛔️
0xc6 SendIRCode ⛔️ ⛔️
0xc7 StopIR ⛔️ ⛔️

ControllerInfoRequest/ControllerInfoResponse

When sent from Host to Controller, takes no data and asks the controller to send its ControllerInfo.

When sent from Controller to Host: The additional data is an array of HardwareInfo, where HardwareInfo is a structure of one byte (Type) and 4 byte (Data). Here are the different types byte observed:

Type ID Name Bootloader Description
1 USB PID The same as the USB PID. Likely more useful for wireless transmission.
2 Unknown ⛔️ Firmware always returns 3
4 Firmware Version Version/timestamp of the firmware running on the LPC side (e.g. 57bf5c10).
5 NRF Firmware Version ⛔️ Version/timestamp of the firmware running on the NRF side
9 Hardware Version Version of the controller hardware (as stored in EEPROM)
10 Unknown ⛔️ Firmware returns the data stored at DAT_10000078

SetSettings

When sent from Host to Controller: Sets the controller settings. The additional data is an array of ControllerSetting, where ControllerSetting is a structure of one byte (type) and 2 bytes (value). Here are some observed type bytes:

Type ID Name Description
0x3 ?
0x8 ? Lizard mode related? Data is 7 when sent to dongle.
0x2d ? Sent periodically

SetDonglePairingMode

Arguments:

  • Don't pair: 0x00 0x00
  • Start pairing: 0x2 0x3c

Touchpad drag function

Is there any support for relative controls? Like take the value of trackpadGetLastXY() on first touch = trackpadFirstXY, then replace the output to the result of percentage of [Square Root of {trackpadFirstXY - trackpadGetLastXY() } ]until the finger is released?
So that the output = the distance dragged.

If this isn't in the code already, what current fields output the XY coordinates? Can I make them a function like the one I referenced?

Fauxcontroller: chip.h not found.

While attempting to compile, the following issues occur;
Fatal error: chip.h: No such file or directory
make: ***[src/subdir.mk:38:src/board.o] Error 1

[Question] SC Custom dongle

Anyway to make a custom usb dongle that runs something similar to steams controller support hardware, so that it may be used and have all the utility it does on steam on separate devices (I.E. Xbox, Ps4, Switch, linux) I know there is a lot of custom software for linux support on non steam games, so maybe something like that to run between a system and the controller.

Switch problem

While using Nintendo Switch firmware my left control stick is slightly uncalibrated. It does not cause issue in most games but fortnite is another story. I recorded video that's presenting the problem. I can't calibrate it using switch, calibrated it using steam but nothing changed.
Here's the video: https://youtu.be/5J1X69yZNNo

Flashing on ubuntu

If you will use "cat new_firmware.bin > /mount/CRP\ DISABLD/firmware.bin" on ubuntu(or similar linux) firmware will be corrupted and controller will not start.

To prevent it, use command:
dd conv=nocreat,notrunc oflag=direct bs=512 if=<path to your firmware> of=<path to sc flash>/firmware.bin

Attempting to convert a jingle on ubuntu results in the program hanging with high CPU usage

OS: Ubuntu 19.04
CPU: AMD Athlon X4 860k
QT Creator: 4.9.1
QT: 5.12.3

The program launches from QT creator without any issues, but attempting to convert a jingle results in one of my CPU cores staying at 100% from the program and the program hanging. The process never finishes.

MusicXML I'm trying to use: https://musescore.com/user/124018/scores/133609
I've tried other ones and the same result occurs.

Terminal-2019-06-12-07:21:39

EDIT: Fixed, I was using compressed musicxml files, not uncompressed.

SCJingleConverter Windows 10 Jingle No Suitable Kits found

Hi! I'm having trouble using the SCJingleConverter I tried downloading the Mingw-64 But it didn't work/may have downloaded the wrong one. After installing QT all I got was No suitable kits found.

qtcreator_fZmnHgYw6P
yypkg_oAtVsd49sP

qtcreator_BOTomsk7hI

Sorry to bug you on an old project, I hope you're still willing to help!

Let me know what to take pictures of!

Support for Wireless usb for custom fimware

Hello.The Steam Controller with the open fimware could be seen as a Switch Pro Controller which could be connected usb.
My question is if the code than Steam use for connect wireless with the usb wireless device/Steam Link could be used with the Switch Pro controller for allow use it wireless.
I know than the usb should be modded with other Pid,vid,.. but with the great sys-con atmosphere module it should no be difficult:

https://github.com/cathery/sys-con

Thanks

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.