Giter VIP home page Giter VIP logo

decompilermc's Introduction

DecompilerMC


What is this for?

This tool will help you convert mappings from mojang from their proguard format to the tsrg format that then can be used directly with specialsource which will then remap the client jar. Once that done it can be decompiled either with cfr (code only) or fernflower (assets and code).

Of course we provide all that toolchain directly so your output will be readable (and soon executable) code as you could get with MCP (ModCoderPack)


Important Note

You need an internet connection to download the mappings, you can ofc put them in the respective folder if you have them physically

We support Windows, MacOS and linux

You need a java runtime inside your path (Java 8 should be good)

CFR decompilation is approximately 60s and fernflower takes roughly 200s, please give it time

You can run it directly with python 3.7+ with python3 main.py

You can find the jar and the version manifest in the ./versions/ directory

The code will then be inside the folder called ./src/<name_version(option_hash)>/<side>

The ./tmp/ directory can be removed without impact

There is a common release here: https://github.com/hube12/DecompilerMC/releases/latest for all version


You can use arguments instead of terminal based choice, this is not required but once you pass a mcversion it will start the process

We recommend using -q everytime otherwise it might ask stdin questions.

By default we employ the nice guy strategy which is if the folder exist we create a new random one, please consider using -f, if you actually need a specific path.

Examples:

  • Decompile latest release without any output: python3 main.py --mcv latest -q
  • Decompile latest snapshot server side with output: python3 main.py --mcversion snap --side server
  • Decompile 1.14.4 client side with output and not automatic with forcing delete of old runs: python3 main.py -mcv 1.14.4 -s client -na -f -rmap -rjar -dm -dj -dd -dec -q -c
usage: main.py [-h] [--mcversion MCVERSION] [--side SIDE] [--clean] [--force]
               [--forceno] [--decompiler DECOMPILER] [--nauto]
               [--download_mapping DOWNLOAD_MAPPING]
               [--remap_mapping [REMAP_MAPPING]]
               [--download_jar [DOWNLOAD_JAR]] [--remap_jar [REMAP_JAR]]
               [--delete_dep [DELETE_DEP]] [--decompile [DECOMPILE]] [--quiet]

Decompile Minecraft source code

optional arguments:
  -h, --help            show this help message and exit
  --mcversion MCVERSION, -mcv MCVERSION
                        The version you want to decompile (all versions
                        starting from 19w36a (snapshot) and 1.14.4 (releases))
                        Use 'snap' for latest snapshot (20w48a for example, it will get it automatically) or 'latest'
                        for latest version (1.16.4 for example, it will get it automatically)
  --side SIDE, -s SIDE  The side you want to decompile (either client or
                        server)
  --clean, -c           Clean old runs
  --force, -f           Force resolving conflict by replacing old files.
  --forceno, -fn        Force resolving conflict by creating new directories.
  --decompiler DECOMPILER, -d DECOMPILER
                        Choose between fernflower and cfr.
  --nauto, -na          Choose between auto and manual mode.
  --download_mapping DOWNLOAD_MAPPING, -dm DOWNLOAD_MAPPING
                        Download the mappings (only if auto off)
  --remap_mapping [REMAP_MAPPING], -rmap [REMAP_MAPPING]
                        Remap the mappings to tsrg (only if auto off)
  --download_jar [DOWNLOAD_JAR], -dj [DOWNLOAD_JAR]
                        Download the jar (only if auto off)
  --remap_jar [REMAP_JAR], -rjar [REMAP_JAR]
                        Remap the jar (only if auto off)
  --delete_dep [DELETE_DEP], -dd [DELETE_DEP]
                        Delete the dependencies (only if auto off)
  --decompile [DECOMPILE], -dec [DECOMPILE]
                        Decompile (only if auto off)
  --quiet, -q           Doesn't display the messages

Build command (for executable):

pip install pyinstaller
pyinstaller main.py --distpath build --onefile

decompilermc's People

Contributors

duchghast avatar earthcomputer avatar hube12 avatar mat-1 avatar tisawesomeness 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

decompilermc's Issues

Merging client and server

I'm proposing to add an option to generate a merged sources directory containing the code for the client and server. Yarn and Forge are currently doing this - basically, the client and server jars get merged into a single jar which are then decompiled and deobfuscated.

I know I would find this feature really useful for a project I'm working on. Also, you would no longer need to decide whether to generate the client or the server when running DecompilerMC (useful for people researching across the stack). I'm guessing it would be faster to generate merged sources than generating both the client and the server individually, too.

I would be down to make a PR for this (if you're okay with Google being the copyright holder over the code I write, since I'm currently interning there).

Error with Experimental snapshots/Combat tests

Experimental snapshots/Combat tests are snapshots that are not in the version manifest, we have to install them manually
So when you want to decompile one of these snapshots, you will logically go to the "versions" folder of DecompilerMC, put the folder containing the version.json exctracted from the zip provided by Mojang and rename the json to "version.json"
And when you run DecompilerMC, you enter the name of the version written on the folder, you get an error because the program deleted the version.json because it is not in the version manifest
Is it possible to manually import the version.json without it getting deleted ?

If you want to reproduce it, you can test with the Combat Test 8c here, you can find info about it here

Compiler seems to be inlining all static constants

I have not found a single static constant used in the classes. Is it a compiler issue?

Here is an example of what such a constant could look like. I searched across the whole project for this but I have not found anything. It's from the 1.17.1 client.

public static final float DEFAULT_BB_HEIGHT = 1.8f;

According to this page there is an CLI option to turn it off --relinkconststring false According to the documentation it does its best to recover the static final and doesn't work when there are multiple public static const but this should make it a bit easier to at least debug the minecraft jars.

Looks like cannot download the mapping

Tnze:DecompilerMC Tnze$ python3 main.py 
Please Run once the snapshot/version on your computer via Minecraft Launcher so it can download it
Please input you decompiler choice: fernflower (f) or cfr (default: cfr) : 
Please input a valid version starting from 19w36a and 1.14.4 : 19w36a
/src/19w36a already exists, wipe it (w), create a new folder (n) or kill the process (k) ? w
Download mappings? (y/n): y
Found 19w36a.json
Downloading the mappings for 19w36a...
Downloading mappings/19w36a/client.txt...
URL Error
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)>
Done!
Remap mappings to tsrg? (y/n): n
Remap? (y/n): y
=== Remapping jar using SpecialSource ====
ERROR: Missing files
Decompile? (y/n): y
=== Decompiling using CFR (silent) ===
ERROR: Missing files
===FINISHED===
Press Enter key to exit

Python requirement should be python>=3.7

As the argument 'capture_output' of subprocess.run is added after python 3.7, when running this script on my python 3.6.4, it will throw an error as follows:

Traceback (most recent call last):
  File ".\main.py", line 650, in <module>
    main()
  File ".\main.py", line 580, in main
    remap(version, side, args.quiet)
  File ".\main.py", line 256, in remap
    ], check=True, capture_output=quiet)
  File "subprocess.py", line 403, in run
TypeError: __init__() got an unexpected keyword argument 'capture_output'

Therefore this script should only work with python 3.7+, instead of the version of 3.5+ which is said in README.

Special source doesnt apply to /Statedefinition$Builder$add

public Builder<O, S> a(Property<?> ... arrproperty) { for (Property<?> property : arrproperty) { this.validateProperty(property); this.properties.put(property.getName(), property); } return this; }
this sould be add and not a but in tsrg i gave
a ([Lnet/minecraft/world/level/block/state/properties/Property;)Lbxh$a; add but it didnt apply the name correctly and i really have no idea why, its the only case tho

How to build

If i would publish the client (Build it) what must i do?

LICENSE.md

Hello! Please add a license file to this project; I've adapted your method which transforms Proguard mappings to TSRG to Java and would like to know if I can use this derivative work in a public project of mine. Thanks!

About 1.11.2 missing json[client_mappings]

Download version 1.11.2, I open 1.11.2json, and I can't this 'client_mappings'. It seems that 1.11.2 not this client_mappings, but 1.14.4 have, so could you work out this issue? thank you :)

【My English is not well】

"Could not load the following classes"

I'm getting some problems with classes not decompiling. Is there something I can do about that or is it just the way things are? 😄

/*
 * Decompiled with CFR 0.146.
 * 
 * Could not load the following classes:
 *  com.mojang.bridge.Bridge
 *  com.mojang.bridge.game.GameSession
 *  com.mojang.bridge.game.GameVersion
 *  com.mojang.bridge.game.Language
 *  com.mojang.bridge.game.PerformanceMetrics
 *  com.mojang.bridge.game.RunningGame
 *  com.mojang.bridge.launcher.Launcher
 *  com.mojang.bridge.launcher.SessionEventListener
 *  javax.annotation.Nullable
 */

newest snapshot updated java to 1.16

So now the compiler isn't working I think, I got the error:

  File "/home/runner/work/decompiled-minecraft/decompiled-minecraft/code/main.py", line 652, in <module>
    main()
  File "/home/runner/work/decompiled-minecraft/decompiled-minecraft/code/main.py", line 582, in main
    remap(version, side, args.quiet)
  File "/home/runner/work/decompiled-minecraft/decompiled-minecraft/code/main.py", line 252, in remap
    subprocess.run(['java',
  File "/opt/hostedtoolcache/Python/3.9.5/x64/lib/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['java', '-jar', '/home/runner/work/decompiled-minecraft/decompiled-minecraft/code/lib/SpecialSource-1.8.6.jar', '--in-jar', '/home/runner/work/decompiled-minecraft/decompiled-minecraft/code/versions/21w19a/server.jar', '--out-jar', './src/21w19a-server-temp.jar', '--srg-in', '/home/runner/work/decompiled-minecraft/decompiled-minecraft/code/mappings/21w19a/server.tsrg', '--kill-lvt']' returned non-zero exit status 1.

TypeError: __init__() got an unexpected keyword argument 'capture_output'

Not a python programmer, not sure why this is happening either. Here is what I did:

% python main.py                
Decompiling using official mojang mappings (Default option are in uppercase, you can just enter)
Do you want to clean up old runs? (y/N): y
Please input you decompiler choice: fernflower or cfr (CFR/f): 
Please input a valid version starting from 19w36a (snapshot) and 1.14.4 (releases),
Use 'snap' for latest snapshot (20w49a) or 'latest' for latest version (1.16.4) :latest
Please select either client or server side (C/s) : 
Downloading versions/version_manifest.json...
Downloading versions/1.16.4/version.json...
Auto Mode? (Y/n): y
Found 1.16.4.json
Downloading the mappings for 1.16.4...
Downloading mappings/1.16.4/client.txt...
Done !
Downloading versions/1.16.4/client.jar...
Done !
=== Remapping jar using SpecialSource ====
Traceback (most recent call last):
  File "main.py", line 650, in <module>
    main()
  File "main.py", line 580, in main
    remap(version, side, args.quiet)
  File "main.py", line 256, in remap
    ], check=True, capture_output=quiet)
  File "/Users/chew/anaconda3/lib/python3.6/subprocess.py", line 403, in run
    with Popen(*popenargs, **kwargs) as process:
TypeError: __init__() got an unexpected keyword argument 'capture_output'

On macOS Big Sur using zsh

Is this a problem with my installation? I've no clue sadly...

Getting error when running the tool inside GH Actions

Stack trace:

Error: Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.util.Arrays.copyOf(Arrays.java:3181)
	at java.util.ArrayList.grow(ArrayList.java:267)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:241)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:233)
	at java.util.ArrayList.add(ArrayList.java:464)
	at org.benf.cfr.reader.bytecode.analysis.opgraph.op3rewriters.Cleaner.removeUnreachableCode(Cleaner.java:59)
	at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisInner(CodeAnalyser.java:420)
	at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisOrWrapFail(CodeAnalyser.java:188)
	at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysis(CodeAnalyser.java:126)
	at org.benf.cfr.reader.entities.attributes.AttributeCode.analyse(AttributeCode.java:96)
	at org.benf.cfr.reader.entities.Method.analyse(Method.java:397)
	at org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:906)
	at org.benf.cfr.reader.entities.ClassFile.analyseTop(ClassFile.java:797)
	at org.benf.cfr.reader.Driver.doJarVersionTypes(Driver.java:225)
	at org.benf.cfr.reader.Driver.doJar(Driver.java:109)
	at org.benf.cfr.reader.CfrDriverImpl.analyse(CfrDriverImpl.java:65)
	at org.benf.cfr.reader.Main.main(Main.java:48)

full logs here: https://github.com/u9g/test-2/runs/2348348062?check_suite_focus=true#step:7:13 any ideas?

Program Decompiles Dependencies

When running the program it would appear it also decompiles dependencies packaged with Minecraft such as fastutil - this obviously takes significantly longer than just decompiling Minecraft and seems somewhat unnecessary?

I don't personally see why one would need them decompiled swell but I'm no expert - perhaps make the dependencies an option in the process?

Python stack trace when I run DecompilerMC with an older Minecraft version without client-mappings

Hi, when I try to run DecompilerMC with an older version of Minecraft that does not support client-mappings, I get an error message. See this example:

I run: python3 main.py --mcversion 1.14
and get this output:

Decompiling using official mojang mappings (Default option are in uppercase, you can just enter)
Manifest already existing, not downloading again, if you want to please accept safe removal at beginning
Version manifest already existing, not downloading again, if you want to please accept safe removal at beginning
Found 1.14.json
Traceback (most recent call last):
  File "/DecompilerMC/main.py", line 736, in <module>
    main()
  File "/DecompilerMC/main.py", line 663, in main
    get_mappings(version, side, args.quiet)
  File "/DecompilerMC/main.py", line 269, in get_mappings
    if url['client_mappings']:
KeyError: 'client_mappings'

I checked the code (main.py ~ line 269). I suggest to change this:

            if side == CLIENT:  # client:
                if url['client_mappings']:
                    url = url['client_mappings']['url']

to this:

            if side == CLIENT:  # client:
                if 'client_mappings' in url:
                    url = url['client_mappings']['url']

btw I use Python 3.10.9

Failed to execute script main

Hello,

I have run main.exe with this command : main.exe --mcv latest -q
And the program return this error :

  File "main.py", line 736, in <module>
  File "main.py", line 668, in main
  File "main.py", line 387, in decompile_cfr
  File "subprocess.py", line 524, in run
subprocess.CalledProcessError: Command '['java', '-Xmx4G', '-Xms1G', '-jar', 'D:\\decompile_minecraft\\DecompilerMC_win\\lib\\cfr-0.146.jar', 'D:\\decompile_minecraft\\DecompilerMC_win\\src\\1.19.4-client-temp.jar', '--outputdir', './src/1.19.4/client', '--caseinsensitivefs', 'true', '--silent', 'true']' returned non-zero exit status 1.
[13700] Failed to execute script main```
I don't know if the process is finished.

Have you an idea, why ?

Add Support to OpenJDK

I downloaded the progam and tried to run with openJDK. The code however, does not allow this and it does not work. I suggest to add openJDK as most devs use this if they code plugins and such

Doesn't decompile bundled jar properly

Minecraft now bundles the actual game logic inside the META-INF/versions folder instead of including it directly. This will only decompile the outer layer, not the actual game logic jar.

How to acces code

So I just did everything described in the wiki but now I am wondering, how I am supposed to edit the decompiled code

Fern Flower decompile method "not silent dunno why"

print('=== Decompiling using FernFlower (not silent dunno why) ===')

Change

    print('=== Decompiling using FernFlower ===')

subprocess.run(['java', "-Xmx1G", "-Xms1G","-jar", fernflower.__str__(), "-hes=0 -hdc=0 -dgs=1 -ren=1 -log=WARN", path.__str__(), f'./src/{decompVersion}/{type}'], check=True)

Change to

        subprocess.run([ 
                                      'java', 
                                     '-Xmx1G',
                                     '-Xms1G',
                                     '-jar', 
                                     fernflower.__str__(),
                                     '-hes=0', 
                                     '-hdc=0', 
                                     '-dgs=1',
                                     '-ren=1',
                                     '-log=WARN' ,
                                    path.__str__(),
                                     f'./src/{decompVersion}/{type}' 
                                   ], check=True)

Just notice the array for the sub sub process. changing each of fern flowers options to stings and pushing them back to the array.

I noticed this after altering for the -log options(TRACE) and adding some and removing some on my local copy. That things where not working as intended.

Then I understood what the
"not silent dunno why"
thing is about,
...
I think

Maybe change the -Xmx1G to a global var but that is for another issue

FWIW Here is what I have if you like for FF side of things.

        subprocess.run([ 'java',
                                   max_mem.__str__(),  
                                   min_mem.__str__(),
                                   '-jar',
                                   fernflower.__str__(),
                                   '-dgs=1',
                                   '-lit=1',
                                   '-rbr=1',
                                   '-din=1',
                                   '-asc=1',
                                   '-udv=1',
                                   '-rsy=1',
                                   '-nls=1',
                                   '-log=WARN',
                                   path.__str__(),
                                   f'./src/{decompVersion}/{type}'], check=True)

Error remapping on MacOS

So I ran the program (had some issues but based on another issue I was able to update ssl on my Mac) and I ran into this error

=== Remapping jar using SpecialSource ====
ERROR: Missing files: ./lib/SpecialSource-1.8.6.jar or mappings/1.14.4/client.tsrg or versions/1.14.4/client.jar
aborting

same thing for doing the server:

=== Remapping jar using SpecialSource ====
ERROR: Missing files: ./lib/SpecialSource-1.8.6.jar or mappings/1.14.4/server.tsrg or versions/1.14.4/server.jar
Aborting

I can confirm that all the "missing files" are actually all there.

Build exe problems.

When you use pyinstaller to generate a .exe file, you won't copy the lib folder to the build folder (using machine translation)

Output folder

I'm suggesting making an argument for output path for the dumped data

CFR heap overflow

I think there's either a problem with cfr or you're not giving it a big enough heap:

Decompiling using official mojang mappings...
Do you want to clean up some leftovers? (y/n): y
Please input you decompiler choice: fernflower (f) or cfr (default: cfr) :
Please input a valid version starting from 19w36a and 1.14.4 : 20w20b
Please select either client or server side (c/s) : c
Downloading versions/version_manifest.json...
Downloading versions/20w20b/version.json...
Auto Mode? (y/n): y
Found 20w20b.json
Downloading the mappings for 20w20b...
Downloading mappings/20w20b/client.txt...
Done !
Downloading versions/20w20b/client.jar...
Done !
=== Remapping jar using SpecialSource ====
Loading mappings
Loading mappings...  0%
Loading mappings... 10%
Loading mappings... 20%
Loading mappings... 30%
Loading mappings... 40%
Loading mappings... 50%
0 packages, 5673 classes, 20412 fields, 45063 methods
Remapping final jar
Remapping jar...  0%
Remapping jar... 10%
Remapping jar... 20%
Remapping jar... 30%
Remapping jar... 40%
Remapping jar... 50%
Remapping jar... 60%
Remapping jar... 70%
Remapping jar... 80%
Remapping jar... 90%
- New -> 20w20b-client-temp.jar
Done in 40.5s
=== Decompiling using CFR (silent) ===
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Unknown Source)
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
        at java.lang.AbstractStringBuilder.append(Unknown Source)
        at java.lang.StringBuilder.append(Unknown Source)
        at org.benf.cfr.reader.state.DCCommonState.getClassFile(DCCommonState.java:156)
        at org.benf.cfr.reader.bytecode.analysis.types.JavaRefTypeInstance.getClassFile(JavaRefTypeInstance.java:416)
        at org.benf.cfr.reader.bytecode.analysis.parse.lvalue.AbstractFieldVariable.getFieldType(AbstractFieldVariable.java:141)
        at org.benf.cfr.reader.bytecode.analysis.parse.lvalue.AbstractFieldVariable.<init>(AbstractFieldVariable.java:28)
        at org.benf.cfr.reader.bytecode.analysis.parse.lvalue.StaticVariable.<init>(StaticVariable.java:22)
        at org.benf.cfr.reader.bytecode.analysis.opgraph.Op02WithProcessedDataAndRefs.createStatement(Op02WithProcessedDataAndRefs.java:1295)
        at org.benf.cfr.reader.bytecode.analysis.opgraph.Op02WithProcessedDataAndRefs.access$100(Op02WithProcessedDataAndRefs.java:56)
        at org.benf.cfr.reader.bytecode.analysis.opgraph.Op02WithProcessedDataAndRefs$11.call(Op02WithProcessedDataAndRefs.java:2065)
        at org.benf.cfr.reader.bytecode.analysis.opgraph.Op02WithProcessedDataAndRefs$11.call(Op02WithProcessedDataAndRefs.java:2062)
        at org.benf.cfr.reader.util.graph.AbstractGraphVisitorFI.process(AbstractGraphVisitorFI.java:60)
        at org.benf.cfr.reader.bytecode.analysis.opgraph.Op02WithProcessedDataAndRefs.convertToOp03List(Op02WithProcessedDataAndRefs.java:2074)
        at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisInner(CodeAnalyser.java:346)
        at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisOrWrapFail(CodeAnalyser.java:188)
        at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysis(CodeAnalyser.java:126)
        at org.benf.cfr.reader.entities.attributes.AttributeCode.analyse(AttributeCode.java:96)
        at org.benf.cfr.reader.entities.Method.analyse(Method.java:397)
        at org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:906)
        at org.benf.cfr.reader.entities.ClassFile.analyseTop(ClassFile.java:797)
        at org.benf.cfr.reader.Driver.doJarVersionTypes(Driver.java:225)
        at org.benf.cfr.reader.Driver.doJar(Driver.java:109)
        at org.benf.cfr.reader.CfrDriverImpl.analyse(CfrDriverImpl.java:65)
        at org.benf.cfr.reader.Main.main(Main.java:48)
Traceback (most recent call last):
  File "main.py", line 382, in <module>
  File "main.py", line 345, in main
  File "main.py", line 196, in decompile_cfr
  File "subprocess.py", line 418, in run
subprocess.CalledProcessError: Command '['java', '-jar', '<CENSORED_PATH>\\lib\\cfr-0.146.jar', '<CENSORED_PATH>\\src\\20w20b-client-temp.jar', '--outputdir', './src/20w20b/client', '--caseinsensitivefs', 'true', '--silent', 'true']' returned non-zero exit status 1.
[8316] Failed to execute script main

Command line options

I plan on using this for a project, it would be nice to have optional command line options in place of the current prompts so this could be automated.

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.