Giter Site home page Giter Site logo

marcussacana / stringreloads Goto Github PK

View Code? Open in Web Editor NEW
85.0 6.0 14.0 12.92 MB

A tool to inject strings into a game using low level code

License: The Unlicense

C# 95.32% Batchfile 3.58% C++ 0.96% C 0.15%
hooking modding modding-tools reverse-engineering

stringreloads's Introduction

My Ko-fi

Buy Me a Coffee at ko-fi.com

StringsReloads v7.6

Build Status

This is a tool created to inject strings using low level code

  • Help translate a game without discovery about he package/encryption.
  • Help use Non-ASCII Characters.
  • Help with a customizable Auto-WordWrap.
  • Help change the game font size (when possible)
  • Help fix non-monospaced char spacing (when possible)
  • Can use with just a small assembly knowledge

Our strategy to inject the string is create a new section using tools like the Stud_PE or CFF Explorer to have space in the executable to append the new code, a commom method is replace a original instruction and jump to your code, generally a jump have 5 bytes of length, sometimes you need replace more than one instruction and don't forget to place original instructions like CMP and TEST after the execution of your code, of course, if have one.

Sample Call Algorithm:

@StrInject:			;Declare StrInject Label
	push EDX		;Backup EDX, ECX, EBX Registers
	push ECX
	push EBX
	push EAX		;The EAX is the string pointer or a unicode character
	call GetProc		;Here the Srl.Process Pointer is catched
	call EAX
	pop EBX			;Restore EDX, ECX, EBX Registers from the "Backup"
	pop ECX
	pop EDX
	jmp RetPnt		;Continue the Execution

We have various method to catch the Srl.Process Pointer, this one is to games who have a dynamic main module alocation, is possible use the sample bellow if you have injected the export in the game executable, you can use Stud_PE or CFF Explorer to do this, You need too create a new executable section to append our new code.

In the case of this Sample the Srl.Process address in the import table is allways relative to the our new executable section.

In the code bellow the catched EIP is to the "pop EAX" and the Srl.Process in the import table is for example 0x02B9C400 and the "pop EAX" is at 0x02B9E44C, so... 0x02B9E44C - 0x02B9C400 = 0x204C, now if we subtract this value of the EIP we can get the position of the Srl.Process pointer.

If you wanna use the SRL to put Non-ASCII Characters you need call the Srl.Process and give the char of a GetGlyph function to he.

Sample Catch Srl.Process:

@GetProc:
	call @Nxt	    	;Call the label Nxt
@Nxt:				    ;Declare the Nxt label
	pop EAX 		    ;Catch the EIP :)
	sub EAX, 0x204C		;Subtract the Difference from the EIP and Import Address
	mov EAX, [EAX]		;Read the import table
	ret

Fastest Reload Method:

After some problems with games that reload string inside a loop I created the GetDirectProcess, to import this function use the same method of the SRL.Process above, But you will change the GetProc, here a example code:

@GetProc:
	call @Nxt	    	   ;Call the label Nxt
@Nxt:			    	   ;Declare the Nxt label
	pop EAX 		       ;Catch the EIP :)
	cmp dword [EAX+0x21], 0;Verify if already have the Address
	jne @Finish
	push EAX              ;Backup NXT Address
	sub EAX, 0x2050		  ;Subtract the Difference from the EIP and Import Address
	mov EAX, [EAX]		  ;Read the import table
	call EAX              ;Calls the GetDirectProcess
	pop EBX               ;Recovery NXT Address
	mov [EBX+0x21], EAX   ;Save the Process Address
	mov EAX, EBX          ;Prepare to Finish
@Finish:
	add EAX, 0x21         ;Ajust Pointer
	mov EAX, [EAX]		  ;Read the Process Address
	ret

@Ptr:
	dd 0                ;Here is the @Nxt: + 0x21

This method don't have paramters, just call and catch the EAX, the EAX is a pointer to the Process function


Auto-Install Feature:

The SRL have a feature to automatically install the SRL in the game engine without you need know how to patch the game.
First, dowload the SRL HERE, extract to the game directory, then rename the SRLWrapper.dll to d3d9.dll; dinput8.dll or any other supported wrapper See Here what is supported, then in the SRL.ini set the AutoInstall to true.

Supported By:

  • AdvHD
  • SoftPal
  • CMVS32 and CMVS64
  • ExHIBIT
  • EntisGLS

Some SoftPal games needs a manual setup with the help of the Auto-Installer, click below to see the example: SRL SoftPal Auto-Install Feature

The EntisGLS AutoInstall only allow you modify the internal engine XML config, and with that, you will be able to set custom fonts and load extracted files.
Just add the <file path="$(CURRENT)\Patch"/> in the generated EntisGLSConfig.xml file and the SRL will automatically force the game use your custom settings.
Note: The priority are in the upper lines, add the line in the top of others <file/> or <archive/> blocks.


Font Modifier

A common feature that the people want from the String Reloads is the Font Modifier feature, this feature works with major part of games that don't have a pre-rendered font and is easy to setup it.
First, dowload the SRL HERE, extract to the game directory, then rename the SRLWrapper.dll to d3d9.dll; dinput8.dll or any other supported wrapper See Here what is supported.
Now, you need to enable the CreateFont hook in the SRL.ini, we have 4 variants of the CreateFont, the CreateFontA, CreateFontW, CreateFontIndirectA and CreateFontIndirectW.
Usually a game use only one of those 4 options, the correct way to know what hook you must enable is find in the game executable if he have the string "CreateFontA", "CreateFontW", "CreateFontIndirectA" or "CreateFontIndirectW"... Or, if you're lazy or you're a bit crazy, you can just enable everything, but isn't recommended.
When you enable the CreateFont hook, the SRL will be able to modify some few things in the game font, like the font size (Not works with all engines) and the font itself.
In the end of the SRL.ini you can found a default 'sample' font remap entry, the [Font.0], you can add more font reload parameters adding a new block with a incremented number in the block name, like [Font.1], [Font.2], [Font.3]...

  • In the From parameter you can set the 'origin' font face name to be modified, where * means all fonts.

  • In the FromWidth or FromHeight you can match the font to be modified by specifying his original size. (By default commented)

  • In the FromCharset you can match the font to be modified by specifying the font charset. (By default commented)

  • In the To parameter you can set your 'target' font face name.

  • In the Charset parameter you can force the font charset to be used, where 0 = auto, commented = don't modify, 932 = SJIS, see more values here

  • In the Width, Height parameters, you can modify the font size, the numbers can be a absolute size or relative size, +5 or -1 are relative values that are calculed with the original font size value. the . prefix in the value specify that value is a absolute value, then .-1 will really became -1 regradless of the original font size.

  • The Width, Height parameters can be even more dynamic if you want, it's possible to set the value as a expression to be evaulated during the runtime, for example, if you set the Width to if([Width] < 0, [Width] * -1, [Width]), this expression will check if the Width is negative, and make him positive, otherwise, does nothing.
    Expressions can have the parameters: [Width], [Height], [Charset], [Facename], you can check details of the expression usage here

Also, in the [StringReloads] block, you can find the LoadLocalFonts parameter, with this parameter set to true, the SRL will make the game be able to load fonts from the game directory (or subdirectory) without need install the font in the host system.

Dependencies:


Useful:

  • Multiline Assembly (Allow put a block of code in a specified position)
    • (Use <0x02B9E44A> for example to set the position to write your code)
  • Auto-Builds: AppVeyor
  • Lastest Build: Download
  • Auto-Releases: Visit

stringreloads's People

Contributors

marcussacana 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

stringreloads's Issues

AdvHD D3D9 Wrapper Bug

The test game is Golden Marriage -Jewel Days-
I tried using the auto-install feature of x86 SRLwrapper, but it just crashed on black screen at startup
.
The game uses the adv engine and the is original
I move both, SRL.ini and SRLWrapper.dll to the game folder (where .exe is), then i rename SRLWrapper.dll to d3d9.dll, open the SRL.ini and set the AutoInstall=true

AdvHD D3D9 Wrapper Bug

I use StringReloads today
Found a problem. The error report is as follows

[INF] SRL - StringReloads v7.6.18
[INF] Created by Marcussacana
[DBG] Working Directory: G:\game\gal\WillPlus\44\StringReloads
[DBG] Initializing SRL...
[DBG] Cache not found, Building database...
[DBG] 0 Database(s) Loaded
[DBG] 0 Remap(s) Loaded
[DBG] 0 Alternative Remap(s) Loaded
[DBG] 0 Hashes Ready
[DBG] Hook "gdi32.dll->CreateFontA" Compiled; Hook: 0x0000000002D71F1E; Bypass: 0x000000000F9A0000
[DBG] Hook "gdi32.dll->CreateFontW" Compiled; Hook: 0x0000000002D71E3E; Bypass: 0x000000000F9B0000
[DBG] Hook "gdi32.dll->CreateFontIndirectA" Compiled; Hook: 0x0000000002D71E8E; Bypass: 0x000000000F9C0000
[DBG] Hook "gdi32.dll->CreateFontIndirectW" Compiled; Hook: 0x0000000002D71EDE; Bypass: 0x000000000F9D0000
[DBG] Hook "gdi32.dll->ExtTextOutA" Compiled; Hook: 0x0000000002D71F6E; Bypass: 0x000000000F9E0000
[DBG] Hook "gdi32.dll->ExtTextOutW" Compiled; Hook: 0x0000000002D71FBE; Bypass: 0x000000000F9F0000
[DBG] Hook "gdi32.dll->GetCharABCWidthsFloatA" Compiled; Hook: 0x0000000002D7200E; Bypass: 0x000000000FFA0000
[DBG] Hook "gdi32.dll->GetCharABCWidthsFloatW" Compiled; Hook: 0x0000000002D7205E; Bypass: 0x000000000FFB0000
[DBG] Hook "gdi32.dll->GetCharacterPlacementA" Compiled; Hook: 0x0000000002D720AE; Bypass: 0x000000000FFD0000
[DBG] Hook "gdi32.dll->GetCharacterPlacementW" Compiled; Hook: 0x0000000002D75196; Bypass: 0x0000000012070000
[DBG] Hook "gdi32.dll->GetGlyphOutlineA" Compiled; Hook: 0x0000000002D7539E; Bypass: 0x0000000012080000
[DBG] Hook "gdi32.dll->GetGlyphOutlineW" Compiled; Hook: 0x0000000002D753C6; Bypass: 0x0000000012090000
[DBG] Hook "gdi32.dll->GetTextExtentPoint32A" Compiled; Hook: 0x0000000002D750CE; Bypass: 0x00000000120A0000
[DBG] Hook "gdi32.dll->GetTextExtentPoint32W" Compiled; Hook: 0x0000000002D7507E; Bypass: 0x00000000120B0000
[DBG] Hook "kernel32.dll->lstrcpyA" Compiled; Hook: 0x0000000002D7534E; Bypass: 0x00000000120C0000
[DBG] Hook "kernel32.dll->lstrcpyA" Compiled; Hook: 0x0000000002D750A6; Bypass: 0x00000000120D0000
[DBG] Hook "OleAut32.dll->SysAllocString" Compiled; Hook: 0x0000000002D7511E; Bypass: 0x00000000120E0000
[DBG] Hook "Kernel32.dll->MultiByteToWideChar" Compiled; Hook: 0x0000000002D752AE; Bypass: 0x00000000120F0000
[DBG] Hook "Kernel32.dll->WideCharToMultiByte" Compiled; Hook: 0x0000000002D7520E; Bypass: 0x0000000012100000
[DBG] Hook "gdi32.dll->TextOutA" Compiled; Hook: 0x0000000002D7502E; Bypass: 0x0000000012110000
[DBG] Hook "gdi32.dll->TextOutW" Compiled; Hook: 0x0000000002D75376; Bypass: 0x0000000012130000
[DBG] Hook "OleAut32.dll->SysAllocString" Compiled; Hook: 0x0000000002D75F6E; Bypass: 0x00000000121A0000
[INF] AdvHD Engine Detected.
[INF] SRL Initialized
[TRC] Character Remaped from to
[ERR] [EntryPoint.cs:74(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)
[ERR] [EntryPoint.cs:74(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)
[ERR] [EntryPoint.cs:74(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)
[ERR] [EntryPoint.cs:74(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)
[ERR] [EntryPoint.cs:74(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)
[ERR] [EntryPoint.cs:74(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)
[CRI] [EntryPoint.cs:77(ProcessW)]
System.Exception: No Database Loaded
in StringReloads.Engine.SRL.get_CurrentDatabase()
in StringReloads.Engine.Match.BasicMatch.MatchString(String String)
in StringReloads.Engine.SRL.MatchString(IMatch This, String String)
in StringReloads.Engine.SRL.ProcessString(String String)
in StringReloads.Engine.SRL.ProcessString(WCString pString)
in StringReloads.EntryPoint.ProcessW(Void* Value)

Question regarding string replacing

Hi,

Really nice tool, using it to change fonts was pretty straight forward and results were good.

However I've got another question, I'm currently working on a translation of a game which has menus built in the .exe file.

Now most of the menus I was able to translate through simple hex editing and resource hacker, but some of the strings are either not defined through resources or are not static and as such I was not able to replace them through hex editing.

This is an example:
Capture

Can StringReloads be used to somehow translate these?

Thanks

About CreateFont function

Hello Marcus! May I ask how to change font of games that have no CreateFont nor CreateFontIndirect function? Thank you.

SoftPAL engine issue

I tested with 2 games and it shows this:

No Supported Engine Detected, Auto SRL Installer Disabled
I tested:
Koi x Shin Ai Kanojo
Anata ni Koi Suru Ren'ai Recette

Koi x Shin Ai Kanojo also shows:
Import Hook Failed: user32.dll => CreateWindowExW
Import Hook Failed: user32.dll => SetWindowPos

Anata ni Koi Suru Ren'ai Recette:
Import Hook Failed: user32.dll => CreateWindowExW

Am I doing something wrong?

SRL.ini's config is the same as The Witch's Love Diary.

winmm.dll Wrapper Bug


stopping.exe - 无法找到入口

无法定位程序输入点 mixerGetNumDevs 于动态链接库 F:\BaiduNetdiskDownload[Nighthawk] Complete series ストッピング 13 [4G]\ストッピング!!! 陸上競技編\stopping.exe 上。

确定

When the game tries to load winmm.dll, it reports that it cannot find the entry point. What should I do? It doesn't display any CMD window or print any logs.

I only changed:

[StringReloads]
AutoInstall=true

[Hooks]
CreateFontIndirectA=true

[Font.0]
To=MS PGothic
Charset=128

OS: WIN10
dll: SRLWrapper.x86.zip

chrome_Xt3UGWcJ5c

Only winmm.dll elicits a response from game.exe, while others like d3d9.dll show no response at all. There are no pop-up windows or error dialogs.

About hacking the rugp engine using StringReloads

Hi marcus. I have a problem with the rugp 6.2 engine of the Schwarzesmarken game by age. Through the debugger, I found this function (seen in the screenshot). Then, through the multiline assembler, I assemble the SRL code in the .patch section. After that, I change those two lines to jmp StrInject, and it seems like everything works fine, SRL is initialized, parses one line (parses correctly), but after that, the game immediately crashes. What could be the problem? Maybe the wrong function? Although, perhaps due to the fact that I do not know assembler at all.
In fact, I tried to do it with your YouTube video, but because I don’t know Portuguese (and English too), it didn’t work.
image
In any case, I now need help, since the translation of Schwarzesmarken into Russian was ready back in 2017, but I could not insert the translation into the game. I would be grateful for your help.

Build problems

J@A(U 4T J}P2XWGIIE_P
l get two errors

Error	CS0246	The type or namespace name 'CoInitializeDelegate' could not be found (are you missing a using directive or an assembly reference?)	StringReloads	C:\StringReloads-master\StringReloads\Hook\Win32\CoInitialize.cs	9	Active
Error	CS1955	Non-invocable member 'Hook<CoInitializeDelegate>.Bypass' cannot be used like a method.	StringReloads	C:\StringReloads-master\StringReloads\Hook\Win32\CoInitialize.cs	23	Active

how can i solve this problem ?
Visual Studio Version 16.7.5

Struggling with font change to fix character limit.

I appreciate these tools being made for VN translation and I'm interested in translating Anata ni Koi Suru Ren'ai Recette. I've installed the plugin and got it to work after a lot of confusion but now I'm stuck on a character limit issue.
image
There it cuts off. I see there is a part of this for font stuff, which I assume is to help with issues like this, but I can't get it to work. I've been using the included [Font.0] in SRL.ini and changing its settings as well trying the different hooks but the text doesn't seem to change.

Some problems with Chinese

Game:

Chinkamo Twins! Futago no Imouto-tachi ni Natsukareteru no wa Wakatteta kedo Masaka Ren'ai Kanjou ni Kawaru Nante Omottenakatta Ken/ちんかもツインズ! ~ふたごの妹たちに懐かれてるのはわかってたけどまさか恋愛感情に変わるなんて思ってなかった件~

Engine:

Softpa

Problems

Use AutoInstall it work well in English,but,when i tried to translate the text to Chinese,something went wrong.
Correct text:
测试文字是否正常
很显然不是很正常,接下里是一段测试文本,测试。
苟利国家生死以,岂因祸福避趋之
QQ截图20200820172541

Why is this happening and what can I do to resolve this?
waiting for my request,thanks.

Translated String doesn't work

Greeting! I've use your method to translate a game using Willplus Engine and I've got SRL.log. However the game seems running without Strings-A_00.lst, therefore the translated strings didn't display in the game. So I'm seeking for a solution. Here's the SRL.log. Could you help me find the issue that cause it? Thank you for your help!
SRL.log

AdvHD Incompatible Game

I try to enable the autoinstall featured (with the x64 SRLwrapper) but the game just start and doesn't do anything more (I even follow the tutorial video), and with the x32 the game crash at the initial launch. The game uses ADVHD engine!

Thanks in advance!

EntisGLS error

First of all, thank you for making a good tool.
I wanted to change the font of the translated game using this tool, and I was able to change it eventually.
But there is a little problem.
Most of the time, there is no problem, but there is a bug in which the game stops in very few sections.
This bug varies from person to person, and the interval that occurs is not constant.
But for some people, it happens unconditionally in certain sections.

f02f211fc814695e72885d470df8c96e2878a30727981b6902e54689cbef260a
5d0eb0ccca8f506ea25b61653b4196ac7c7543dccba9db618efc2247a94f5fe6

I tried many things, and after tracking the cause, I found out that the dll file (library file) I attached to change the font was the cause.
In areas where bugs occur unconditionally,
If you didn't use the wrapping function, you could see that there was no bug.

We received the latest version of the 32-bit SRLWrapper file released here, and we modified the SRLWrapper.dll file to winmm.dll.

I wanted to create a log file for you, but when I changed the settings to create a log file,
the game would freeze as soon as I started it, so I couldn't create a log file.

In this game, if you don't change the font, the string is truncated, so you must be able to change the font and font size.
And since the translation work has already been completed, I hope the bug will be fixed.

[link removed]

I think it's a difficult problem to predict just by the explanation, so I'm attaching the entire package. The font is in a separate font folder, so you can install it.

We may have to make a boring check for the test, but I attached a save file for the section where there are many errors.(Last file)

I ask for your help me. Thank you.

Game doesn't start

I'm trying to use SRL on a SoftPAL game, Bakunyuu Okami and am getting this error.
When I launch the game, it doesn't start up at all and just the command prompt shows up displaying this error.
I enabled AutoInstall and Debug in SRL.ini

[DBG] Hook "kernel32->LoadResource" Compiled; Hook: 0x0000000005161DB6; Bypass: 0x0000000007B10000
[ERR] [EntryPoint.cs:45(Process)]
System.NullReferenceException: Object reference not set to an instance of an object.
   at StringReloads.Hook.Base.MemoryCodeReader.ReadByte()
   at Iced.Intel.Decoder.ReadByte()
   at Iced.Intel.Decoder.Decode(Instruction& instruction)
   at StringReloads.Hook.Base.Extensions.DecodeMany(Decoder Decoder, UInt32 MinLength)
   at StringReloads.Hook.Base.Hook.AssemblyHook()
   at StringReloads.Hook.Base.Hook.Compile(Boolean ImportHook, Nullable`1 TargetModule)
   at StringReloads.Hook.Others.EntisGLS_eslHeapAllocate.Initialize()
   at StringReloads.AutoInstall.EntisGLS..ctor()
   at StringReloads.Engine.SRL.get_Installers()
   at StringReloads.Engine.Initializer.PluginsInitializer(SRL Engine)
   at StringReloads.Engine.Initializer.Initialize(SRL Engine)
   at StringReloads.Engine.SRL.ResolveRemap(IMatch This, Char Char)
   at StringReloads.EntryPoint.Process(Void* Value)
[ERR] [Initializer.cs:28(Initialize)]

I already have the .lst file from LSTGenerator and I'm using SRLWrapperx86 with d3d9.dll.
Here is the full log file
SRL.log
I also tried this on Ai Kiss and have the same error.

font program

after i creater new font has char vietnamese corresponding char of SJIS but in game, chars vietnamese are gone in location of it

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.