Coder Social home page Coder Social logo

margerine's Introduction

margerine

Episode 2: Revenge of the ¯\_(ツ)_/¯

margerine is a root exploit and adb enabler for the DJI Air Unit (wm150), Caddx Vista (lt150), FPV Goggles V1 (gl150), and FPV Googles V2 (gl170/gp150) from the same people that brought you USB Video Out.

Currently only works reliably on Windows and Mac OS X, Linux has strange issues in the USB stack - YMMW.

tl;dr;

Install nodejs v16 or above and the Javascript dependencies:

npm install

Remove your SD card for the duration of the exploit, power up the device, connect it via USB and run:

node margerine.js unlock

Have fun! consider donating and join us on our Discord.

Troubleshooting

  • waving wand, result e0 - make sure you've followed all the instructions below, reboot your Goggles and try again. It should eventually work.
  • The device might change it's COM port number on Windows (eg. COM4 -> COM5) in the middle of the exploit and error out. That's a good sign! Look up the new COM port in Device Manager (if auto detect didn't work for you) and re-run the exploit to finish everything up.
  • The device being exploited should not be connected to anything else; i.e. Googles to AU or AU to Goggles.
  • Make sure there's no SD card in your device.
  • V2 Goggles must be flashed from DIY mode to 01.00.0606.
    • Checking the menus in DIY mode is insufficient. Make sure Assistant says "Refresh" next to 0606, rather than "Downgrade". If you see "Downgrade", go ahead and downgrade.
    • If you've flashed to 01.02.0015 in drone mode the exploit won't work and you can't downgrade at the moment, sorry.
    • Despite the bigger version number 01.02.0020 in drone mode, goggles can be downgraded to 0606 in DIY mode.

Other notes

  • Requires an internet connection. Challange signing procedure happens on Drone-Hacks server kindly provided by @bin4ry.
  • Takes few minutes. Make sure your battery is not too low when powering AU/Vista from a quad.
  • You have to run node margerine.js lock before the Assistant will allow you to flash firmwares again.
  • Disables SELinux for you
  • On *150 remounts /proc/cmdline so that mp_state=engineering, which enables adb
  • With great power comes great responsibility - you CAN bootloop/brick your device if you modify or delete important files. There are currently no low level recovery methods available.

What can I do with this?

  • Play Doom
  • Customize the UI theme in /system/gui/xml/themes/defult/theme.xml
  • Pair an Air Unit (or Vista) to another Air Unit using /system/bin/modem_info.sh reverse on one of them.
  • Talk to connected devices via TCP or UDP. Goggles are 192.168.41.1 and air side is 192.168.41.2.
  • Debug USB devices such as input on V2 Goggles (no OTG on V1) by adb shell-ing into a connected Vista/AU and then using adb connect 192.168.41.1 && adb shell to debug wirelessily.
  • Build stuff with the latest Android NDK armv7 architecture, target platform 23.
    • A modified Directfb framebuffer library is available for drawing to an ARGB target to be overlaid on top of the video feed.
    • Direct access to the framebuffer is not available, except via special undocumented DMI bullsh*t.
    • Check out the dfbdoom project.
  • Reverse engineer stuff with IDA, Ghidra and/or Frida.

Additional Documentation

Check out our wonderful wiki.

Advanced usage

node margerine --help
margerine <command>

Commands:
  margerine unlock [serialport]        unlock device and enable adb
  margerine lock [serialport]          disable adb and relock device
  margerine proxy [port]               start the built in http -> https proxy
  margerine.js shell <command> [port]  execute a command on rooted device,
                                       once per reboot
Options:
  --help     Show help                                               
  --version  Show version number                                       

To-do

See the wiki.

It's spelled margarine

No, it's not.

Credits

While this is an original exploit by Joonas Trussmann, it would not have been even remotely possible without work by @tmbinc and @bin4ry. Also a shout out to the rest of the OG's for all their work on dji-firmware-tools.

Special thanks go to: @jaanuke, @funnel and @fichek over on our Discord.

Support the effort

If you'd like, you can support the effort on Open Collective, send some ETH to 0xbAB1fec80922328F27De6E2F1CDBC2F322397637 or BTC to 3L7dE5EHtyd2b1tXBwdnWC2MADkV2VTbrq.

margerine's People

Contributors

j005u avatar jaanuke avatar robinduckett 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

margerine's Issues

Custom osd turns off betaflight osd

Hey guys

Just completed the root and wtfos install completed the betaflight cli commands required and while all was successfully completed when I turn off the dji custom osd I lose the entire betaflight osd. Also to note I don't have access to the betaflight menu on the goggles not exactly sure where I have gone wrong if at all?

Cheers

Couldnt patch startup

First of all, thank you very much for this aweseome work!

I have a GP150 on 01.00.0606 (v2, maybe i misunderstood the compatibility? -> what is DIY mode?)

Wand is working but has problems patching the startup:
COM port is the same during the complete process

found GP150 (v2)
waiting for device to reboot
asking nicely
waving wand
asking again, this time with some gusto
waiting for device to reboot
waiting for device to reboot
leaving something to remember me by
couldn't patch startup, retrying
leaving something to remember me by
couldn't patch startup, retrying
leaving something to remember me by
couldn't patch startup, retrying
leaving something to remember me by
couldn't patch startup, retrying
leaving something to remember me by
couldn't patch startup, retrying
leaving something to remember me by
couldn't patch startup, retrying
leaving something to remember me by
couldn't do the magic. please read the notes in README.md, restart your device and try again
couldn't patch startup, sorry

Add butter to Activating-the-DJI-FPV-Combo.md

The current version of the "Activating..." wiki page was created before butter and does not mention it at all. This is somewhat misleading for a new WTF.OS user, who just clicked wiki. As well as the warnings that look like user should avoid updating the firmware at all costs.

Also, personally, I had v01.02.0000, but the option to switch to "DJI Digital FPV System" only appeared after I upgraded the firmware to v01.03.0000. So, maybe "If you still don't have the option your Goggles have a very old factory firmware" is not entirely true, maybe this applies, say, to all versions that were originally sold together with the drone or something.

I'd like to suggest the following new version:

This guide will walk you through getting your brand new DJI Goggles (or the whole FPV Drone kit) activated. Before the [butter](https://github.com/fpv-wtf/butter) was introduced, it was important to do this without having to flash the dreaded 0015 firmware. 
I highly recommend reading through the whole thing before jumping in so you don't rush ahead at any point and miss critical nuances.

Please bear in mind that since this uses official methods to activate your devices, it may stop working at any time. If this is the case, please contact us on [Discord](https://discord.gg/7w4KTyGpqF) or open an [Issue](https://github.com/fpv-wtf/butter/issues/new) so we can update the guide to reflect this.

Finally, keep in mind this will very likely void your warranty.


### Activating the Goggles

Start up your Goggles and navigate to Settings, About, switch to "DJI Digital FPV System" mode (aka DIY mode). This should be the last entry in menu, just below "Reset All". If you don't see this option, try the following:

   1. Pair your Goggles to your FPV Drone (without activating or going online, if you'd like to avoid downgrading with Butter later!), restart the Goggles.
   2. Take your PC offline and connect your Goggles to DJI FPV Assistant 2 on your PC and then check again if the option to switch modes showed up.
   3. Update the firmware to a new version using [DJI FPV Assistant 2](https://www.dji.com/ee/downloads/softwares/dji-assistant-2-dji-fpv-series) (you would be able to easily downgrade the firmware version with butter after the activation).  
   4. If you're not based in the US you may need to also use a VPN to log into the FPV Assistant 2 while connected to a US server and then go offline completely before connecting the Goggles to Assistant.
   5. Download and flash [V01.02.0001](http://dankdronedownloader.com/DDD2/app/index.php?model=gl170&ver=01.02.0001&type=Other&Brand=DJI) to the Goggles with Dronehacks in FPV Drone mode. Then try all the above steps again.

After switching to the "DJI Digital FPV System" restart your Goggles.  



Now that you're in the HD FPV System mode (a.k.a. DIY mode used with custom built quadcopters) connect your Goggles to your PC, activate them with DJI FPV Assistant 2 and upgrade/downgrade the firmware to V01.00.0606. Ignore the current version as shown in the header of the assistant window, re-flash the firmware in any case.

### Rooting the Goggles option 1, via butter (simple)
Download the pre-built package from https://github.com/fpv-wtf/butter#usage and follow the README.txt inside. 

### Rooting the Goggles option 2, via margerine (more involved, obsolete)

**What you'll need**:
 - [nodejs](https://nodejs.org/) installed - for running margerine
 - [margerine](https://github.com/fpv-wtf/margerine/releases) the Goggles root exploit - for defeating forced upgrade mode on the Goggles
 - [adb](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) Android Debug Bridge - for talking to the rooted Googles
 - [Dronehacks](https://drone-hacks.com/download) desktop client - for free drone firmware flashing
 - [V01.02.0020 FPV Drone firmware](http://dankdronedownloader.com/DDD2/app/index.php?model=wm170&ver=01.02.0020&type=Aircraft&Brand=DJI) from Dank Drone Downloader - for tricking Fly App activation logic
 - (optionally) [V01.02.0000 FPV Drone firmware](http://dankdronedownloader.com/DDD2/app/index.php?model=wm170&ver=01.02.0000&Brand=DJI) from Dank Drone Downloader - for downgrading to an exploitable firmware on the drone after all is said and done
 - Minimal ability with the command line (navigating to downloaded folders and running commands as instructed)
 - Patience!

In order to be able to get rid of the forced upgrade state in your Goggles later, we'll need to root the Goggles with margerine while in DIY mode. Open up the Command Prompt (or Powershell) and navigate to wherever you downloaded and extracted margerine. To get everything ready run:

    npm install
Now power up your Goggles, connect them via USB and run:

    node margerine.js unlock
If you get the error **waving wand, result e0** restart your Goggles and try again. If that doesn't help check out the Troubleshooting tips in the margerine [README](https://github.com/fpv-wtf/margerine).

Now you should see the following in the command output:

    device should be unlocked, try 'adb devices'
Navigate to the folder where you downloaded and extracted adb and run:

    adb shell
You should see the following output:

    [sec_debug_state:202] secure debug value 0x1
    root@pigeon_wm170_gls:/ #
Type `exit` to close the debug connection for now.
### Activating the Drone
Use the Dronehacks client you downloaded to flash the V01.02.0020 firmware you downloaded onto the drone. No license or login required. Don't worry, 0020 is actually older than the notorious 0015 and while it does prevent you from hacking the drone, it can later be downgraded to vulnerable versions. 

**Make sure to read the whole proceeding paragraph before proceeding or you'll get your Goggles in a bad state.** 

Now, connect your Goggles (with the Drone and RC powered up and bound) to the [DJI Fly](https://www.dji.com/downloads/djiapp/dji-fly) app on your phone and activate the drone. **This is very important** - disconnect your Goggles from your phone **as soon as the drone is done activating** and the Goggles 0015 firmware starts downloading (don't worry, it's safe even if it's managed to already start uploading the firmware to the Goggles). Your Goggles will now be in a forced upgrade state, but don't worry, we can fix this, since we rooted with margerine earlier.
### Fixing the Goggles forced upgrade state
Connect your Goggles back up to your PC and go back to the folder where you ran adb previously. Now run:

    adb shell
    rm /cache/force_upgrade
    setprop dji.prop.enforce_upgrade 0
    reboot
Congrats! The forced upgrade state should be gone, all your devices activated and everything in a hackable state. You'll get a warning of firmware version mismatch on the Goggles and Drone, but this can be dismissed. Such is the price of freedom. As far as we know, this shouldn't cause any actual problems with flight.

If you want to purchase a Dronehacks license to remove some limits on your Drone, then now is a good time to use the free version to downgrade your Drone back down to V01.02.0000. Dronehacks Pro license will also allow you to root your drone for low level access if you so wish.
### Have fun and fly responsibly
With great power comes great responsibility. Don't stain the FPV community's image and get us regulated even harder by doing stupid stuff in No Fly Zones. If you're the idiot that gets their stunts on the news we'll laugh really hard at you and newer talk to you again.

Please consider [donating](https://www.buymeacoffee.com/fpv.wtf) if you found this guide useful. BTC and ETC addresses also available in the margerine [README](https://github.com/fpv-wtf/margerine#support-the-effort).

Serialport issue

Get this message on Ubuntu

margerine-master$ node margerine.js unlock
internal/modules/cjs/loader.js:638
throw err;
^

Error: Cannot find module 'serialport'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object. (/home/mindaugas/Downloads/margerine-master(1)/margerine-master/margerine.js:1:20)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)

problem dji googles v2 015

hi i have this problem. my dji googles v2 are back from dji and they have the new firmware 015. my dji fpv holds dronehack 00 what can i do?

Why obfuscate the code?

Hey, great project - thank you.

I am really interesting in learning how the exploit works - obfuscating the code does not make this any easier. Just wondering why you decided to obfuscate? I would understand it if it was to make DJIs life harder to patch the hole, but it seems it is patched with their "latest" firmware anyway, no?

AU/Vista input voltage to OSD

As a user of the DJI FPV without a flight controller the display of the AU/Vista input voltage would be beneficial for use with the DJI FPV system.

The simple usecase is as follows:

  • Pilot installs AU/Vista unit in an airframe with direct flight battery connection according to hardware limitations.
  • Pilot powers on in AU/Vista and FPV goggles entering flight playback OSD.
  • According to value read and position values the flight battery is painted to the OSD.

The following comes from @funnel on fpv.wtf Discord:


it's possible this is where the voltage value is in on the AU. not 100% sure, need to do more tests to confirm
cat /sys/devices/platform/soc/f0a00000.apb/f0a71000.omc/voltage4

https://discordapp.com/channels/849931046883819550/950499167237718136/960576273841786910

multiplied by ~0.01584

yes it is. I went through 13-16.8V with a psu and that's where you can read it. The average factor on my old big AU is 0.015833
I don't have a Vista to test

Getting both OSDs, Vista goes to low power immediately, cannot toggle in/out of OSD mode….

Ok, bear with me a bit lol.

I rooted googles and vista units, everything reports fine and if I switch on the debug stuff in the googles, it all works as expected and everything is up to date.

Firstly, I get both lots of OSD’s, the DJI one comes on then after a few seconds the entire DJI OSD goes off, and comes back on with the Betaflight one on top of it, once this happens the vista unit goes into low power mode almost immediately but if I disable the Betaflight osd on both the googles and vista, the DJI OSD works fine and the vista doesn’t go into low power mode (I’ve got a fan on it and the wtf.fpv configurator reports the temp to be no more than 60C).

I’ve seen mention online that to enable the Betaflight OSD you push and hold the back button for 5 seconds, if I do that with the BOSD enabled at startup, nothing happens (presumably because the OSD is operating) but if I do that with the BOSD not enabled in the startup menu in the configurator, after 3 seconds the googles go into the screensaver mode and I have to press any button to get back to the FPV view.

What an I doing something wrong?

any help much appreciated…..

found GP150 and reboots but can't continue

I can't seem to get beyond this, It looks promising but then catches this error, I've tried rebooting and redoing this procedure dozens of times so far, any tips?

v01.00.060

found GP150
waiting for device to reboot
asking nicely
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
unexpected response seq and no more packets to try

AU/Vista HDMI input through mipi port

Hi there, i wonder if it will be possible in the future to add a attach a female hdmi port to the vistas mipi input to transmit whatever signal you like. That would be pristine for gimbal operating to get framing perfect. Yes latency would go up but thats not a big problem if it stays below 200ms or smth like that.

Greets

geofence osd warning

betaflight and inav both lack of geofence function but we need it for legal flying in many country

is it possible to read gps location from msp data, then show warning at osd if fly near nfz (port nfz data from dji fpv ?)

Goggles firmware out of date - latched message.

Hello everyone. I have the firmware version 1.2.0000 on the DJI Goggles. Unfortunately, the system forces me to uprade to version 0015. There is a latched message. Is there a way to go ahead without upgrading to 0015? Thank you for your help. I can repay you with a donation.

V2 Wifi capability

Havent looked in the system yet. Couldnt it be that, the antennas are listed as interfaces, which could be configured as Wifi clients. V2 has 2.4 GHz

Lua controled video overlay

Hi,
Do you think that it's possible to implement lua scripting to draw on a video overlay ?
There would be great to simply load lua script to sd card, which would utilize telemetry data and draw whatever we want, let say virtual obstacle, augmented reality things, etc...
Kris

Root DJI Transmitter

Is it likely for the transmitter to be rooted as well? I have the Full-Sized TX and was wondering if it could be added to the list?

Thanks for your amazing work! Can't wait to see what comes from it.

Air Unit Recording

I fly with fixed wings and quadcopters, on fixed wings I use air units and on quadcopters I use caddx vista.
I like to record videos on the air units, but when I change from quadcopter to fixed wing, the recording on the air unit is disabled and I often forget to reactivate it from the glasses.
there would be no way that the glasses automatically switch the recording mode according to the unit used?

V2 Goggle with V01.02.0015 does not work

I have updated my v2 glasses before it became public not to do it, then tested the script, as expected it does not work with V01.02.0015

$ node margerine.js unlock
margerine - brought to you with love by the fpv.wtf team
special thanks to @tmbinc, @bin4ry, @jaanuke and @funnel

hang in there, this is going to take a few minutes

found GP150
waiting for device to reboot
asking nicely
result e3
couldn't do the magic. please read the notes in README.md, restart your device and try again
invalid season ticket

Is it possible to get this work with the new version?

v2 Goggles unable to lock

Windows 11, v2 goggles

Margerine Master:
node margerine.js lock

margerine - brought to you with love by the fpv.wtf team
special thanks to @tmbinc, @Bin4ry, @jaanuke and @funnel

found GP150
TypeError: Cannot read properties of undefined (reading 'install')
at C:\drones\margerine-master\src\exploit.js:1:168024
at async wrapSentry (C:\drones\margerine-master\src\utils.js:134:5)

Margerine 1.1-wip:
node margerine.js lock
margerine - brought to you with love by the fpv.wtf team
special thanks to @tmbinc, @Bin4ry, @jaanuke and @funnel

found GP150
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
unexpected response seq and no more packets to try

Discord link

Could you please link your Discord in the README? I'd really like to join.

Complete dump

Hallo, is there already a complete dump of all files availible to take a look on the files? Maybe it's not an issues, but I do not know where I can ask this think.

Specify requirement to use Node.js version 16.x

I tried this on Node v14 and it failed to run, erroring with

couldn't do the magic. please read the notes in README.md, restart your device and try again
TypeError [ERR_UNKNOWN_ENCODING]: Unknown encoding: base64url
    at Buffer.toString (buffer.js:803:11)
    at /Users/robin/dev/margerine/src/exploit.js:1:81335
    at new Promise (<anonymous>)
    at /Users/robin/dev/margerine/src/exploit.js:1:76415
    at async /Users/robin/dev/margerine/margerine.js:49:16
    at async wrapSentry (/Users/robin/dev/margerine/src/utils.js:134:5) {
  code: 'ERR_UNKNOWN_ENCODING'
}

Exploits shared with FPV Drone?

Would this root facilitate rooting the FPV Drone?

That might facilitate a whole new world of new features, PID tuning, etc.

I assume some of the exploits are common since you said you shared some with Dronehacks and they also require the drone on firmware 1.02.0000 to work.

Error "This error originated either by throwing inside of an async function"

Trying to apply exploit on macos m1, get an error

  1. Version is correct (01.00.0606)
  2. Device is visible by assisance
  3. No SD card
fippo@fippo ~/koding/margerine (master)$ node margerine.js unlock /dev/cu.usbmodem105
margerine - brought to you with love by the fpv.wtf team
special thanks to @tmbinc, @bin4ry, @jaanuke and @funnel

hang in there, this is going to take a few minutes

This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
unexpected response seq and no more packets to try

AU/Vista Possible Features

Waited for DJI FPV Hack from the very beginning, you finally did it! Thank you!
Unlocked adb in my Goggles and Vista, unfortunately i'm not a software developer so i hold breath and wait for interesting features.
I will try to help as much as I can, testing/debug, donate when the opportunity arises.

I can ask some interesting questions? (Maybe some questions will inspire the idea to implement interesting functions).

  1. Theoretically is it possible to somehow hack AU/Vista and unlock features that are not available for Caddx Polar and other cameras?(adjust the image aspect ratio, scene, exposure, saturation, white balance, 120fps??);

  2. "Theoretically Vistas should be able to support USB OTG", so whether it will be possible to connect the USB camera and broadcast video to Goggles? (Connect USB Web camera or IR camera like Seek Thermal... and switch between main/secondary cameras);

  3. 0600 added 50mbit mode, it is obvious that the speed limit is artificial, theoretically is it possible to somehow disable the upper speed threshold (50Mbit) to increase image quality? (810p/960p/1080p), or maybe it doesn't work the way we used to think? (More Mbit=Better);

  4. Display the temperature of AU/Vista on screen?

Thank you!

DJI goggles notification: "Firmware versions do not match"

Although I updated all my Vista's and my goggles v1 to V01.00.0606 I get a DJI based pop-up notification which reports: "Firmware versions do not match. Use DJI Assistant 2 (DJI FPV Series) to upgrade." at the very beginning of the transmission. The video transmission and the msp-osd is working. If I click on "Check" I can see that the goggles and the vista have the correct and equal FW version. If I click on "Skip" everything is working as expected. Due my goggles and vista's are rooted I can't check the FW version anymore with DJI Assistant 2 because it reports "Cannot load firmware list".

How can I get rid of this nasty pop-up when I start the transmission? Is there a way to supress it anyway?

Put vtx power in osd?

Is it possible to add vtx power to the DJI OSD overlay?

a few of us in our club run with auto temp control off so that if we crash we don’t automatically loose video when disarming, but if we do crash and have to do the walk of shame, we manually either turn down the vtx power to 25mw or turn auto temp control on.

Full blown hilarious reactions result when you get back, take off and fly away forgetting that you’ve turned the power down to 25mw, rinse and repeat.

having the mw selected on the DJI OSD overlay would be a major plus and stop us taking off at the wrong power levels.

or is this already possible through the existing hacks?

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.