arjanaswal / stockfish Goto Github PK
View Code? Open in Web Editor NEWThe Stockfish Chess Engine for Flutter.
License: GNU General Public License v3.0
The Stockfish Chess Engine for Flutter.
License: GNU General Public License v3.0
Would be possible to load the Engine afterwards as extension to the app?
Would be awesome to reduce the app size :).
Cheers 🙌
Very good project, thanks for it.
Will you upgrade ffi to latest version 2.0.1? It is not compiled at the moment.
Since I installed the 1.4.0
version on lichess mobile, I get a crash on android each time I start to analyse a position, when running in debug. (I believe there is no problem in release mode, but I haven't checked for sure).
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000000
Cause: null pointer dereference
x0 0000000000000000 x1 b4000077ff0597d0 x2 0000000000000000 x3 000000772b0a7953
x4 00000076747446b8 x5 000000772f06d9c0 x6 0000992d000097ec x7 000097320000995d
x8 0000000000000000 x9 6e8111fab3b8fca3 x10 6e8111fab3b8fca3 x11 0000000000000010
x12 0000000000000869 x13 0000967b000095f4 x14 00000000000ab04e x15 000000273c83f51a
x16 000000770d4639a0 x17 00000079e42f4c00 x18 0000007672502000 x19 00000000000005c7
x20 b40000775f0d3bd0 x21 b40000774f0e83b0 x22 0000000000000000 x23 0000000000008f70
x24 000000000000063c x25 000000770d4583e0 x26 00000000000005fa x27 00000079bf6716e8
x28 0000000000008000 x29 0000007674744750
lr 000000770d458a70 sp 0000007674744750 pc 000000770d458a70 pst 0000000060001000
backtrace:
#00 pc 000000000000ca70 /system/lib64/libsoundpool.so (std::__1::__shared_ptr_pointer<_jobject*, (anonymous namespace)::make_shared_weakglobalref_from_localref(_JNIEnv*, _jobject*)::'lambda'(_jobject*), std::__1::allocator<_jobject> >::__on_zero_shared()+24) (BuildId: 7edb0bed6472f7cc98cd807f4686c293)
#01 pc 000000000000c458 /system/lib64/libsoundpool.so ((anonymous namespace)::ConcurrentHashMap<android::SoundPool*, std::__1::shared_ptr<_jobject> >::~ConcurrentHashMap()+120) (BuildId: 7edb0bed6472f7cc98cd807f4686c293)
#02 pc 00000000000b9ca4 /apex/com.android.runtime/lib64/bionic/libc.so (__cxa_finalize+280) (BuildId: 01331f74b0bb2cb958bdc15282b8ec7b)
#03 pc 00000000000ac944 /apex/com.android.runtime/lib64/bionic/libc.so (exit+24) (BuildId: 01331f74b0bb2cb958bdc15282b8ec7b)
#04 pc 0000000000086e84 /data/app/~~cdpj1pH9f8RYf1rmHy9Y_Q==/org.lichess.mobileV2-N-GRiA8RV6gRWSXBX0l2Sg==/lib/arm64/libstockfish.so (Stockfish::Eval::NNUE::verify()+1880) (BuildId: cd76b5ca9d2b576e80aae8ea9e78d2a9f8deaa2f)
#05 pc 000000000009ec10 /data/app/~~cdpj1pH9f8RYf1rmHy9Y_Q==/org.lichess.mobileV2-N-GRiA8RV6gRWSXBX0l2Sg==/lib/arm64/libstockfish.so (Stockfish::MainThread::search()+452) (BuildId: cd76b5ca9d2b576e80aae8ea9e78d2a9f8deaa2f)
#06 pc 00000000000b4e44 /data/app/~~cdpj1pH9f8RYf1rmHy9Y_Q==/org.lichess.mobileV2-N-GRiA8RV6gRWSXBX0l2Sg==/lib/arm64/libstockfish.so (Stockfish::Thread::idle_loop()+276) (BuildId: cd76b5ca9d2b576e80aae8ea9e78d2a9f8deaa2f)
#07 pc 00000000000b9a20 /data/app/~~cdpj1pH9f8RYf1rmHy9Y_Q==/org.lichess.mobileV2-N-GRiA8RV6gRWSXBX0l2Sg==/lib/arm64/libstockfish.so (void* Stockfish::start_routine<Stockfish::Thread, std::__ndk1::pair<Stockfish::Thread*, void (Stockfish::Thread::*)()> >(void*)+40) (BuildId: cd76b5ca9d2b576e80aae8ea9e78d2a9f8deaa2f)
#08 pc 00000000000b63b0 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: 01331f74b0bb2cb958bdc15282b8ec7b)
#09 pc 00000000000530b8 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 01331f74b0bb2cb958bdc15282b8ec7b)
Lost connection to device.
The crash is due to stockfish not able to load the NNUE file.
Since the previous working version was 274cf52e637e9a663d226ec31cc0b24e639cb615
, I believe this commit is the cause of the issue: lichess-org@3fab174, probably because of the namespace.
I'm not really sure what is needed to keep the compatibility of AGP and avoid that bug.
Also it is probably worth investigating why it crashes in that case instead of exiting properly.
Not GPL. But Stockfish v14 is GPL.
I don't know if ffi will let the engine run in a different process space so that the dart part can get rid of the GPL restrictions, so I'll ask you. Thanks!
Crashing on real device (Pixel 5):
I/flutter (17212): test
I/flutter (17212): RouteSettings("/", null)
D/CompatibilityChangeReporter(17212): Compat change id reported: 179274888; UID 10476; state: LOGGED
I/flutter (17212): test
I/flutter (17212): RouteSettings("/game/new-ai", null)
F/appproc (17212): Error changing dalvik-cache ownership : Permission denied
F/libc (17212): Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 17471 (DartWorker), pid 17212 (khad.white_pawn)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/redfin/redfin:S/SPB1.210331.013/7333779:user/release-keys'
Revision: 'MP1.0'
ABI: 'arm64'
Timestamp: 2021-05-28 10:56:31.896867306+0200
Process uptime: 0s
pid: 17212, tid: 17471, name: DartWorker >>> im.khad.white_pawn <<<
uid: 10476
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'Error changing dalvik-cache ownership : Permission denied'
x0 0000000000000000 x1 000000000000443f x2 0000000000000006 x3 0000007b723f9c10
x4 646d766e1f646762 x5 646d766e1f646762 x6 646d766e1f646762 x7 7f7f7f7f7f7f7f7f
x8 00000000000000f0 x9 a3eb7c49514cfb52 x10 0000000000000000 x11 ffffff80fffffbdf
x12 0000000000000001 x13 000000000000003a x14 0000007b723f9e60 x15 0000000000000050
x16 0000007ed3603068 x17 0000007ed35e0950 x18 0000007b71c76000 x19 000000000000433c
x20 000000000000443f x21 00000000ffffffff x22 0000007c3790c000 x23 0000007b723fa378
x24 0000007b723fc000 x25 0000000000000000 x26 0000007c3790b000 x27 0000000000000000
x28 0000007b723fc000 x29 0000007b723f9c90
lr 0000007ed359375c sp 0000007b723f9bf0 pc 0000007ed3593788 pst 0000000000001000
backtrace:
#00 pc 0000000000050788 /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 913f3dd27e3b19e9d61a7a65f13548e7)
#01 pc 00000000005b6114 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+676) (BuildId: f4e20cda211c7943fa6824a4307d7cfd)
#02 pc 000000000001595c /system/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*)+76) (BuildId: 09ac3d101f65baf5b5700a809c02f1f8)
#03 pc 0000000000006dc8 /system/lib64/liblog.so (__android_log_assert+308) (BuildId: 107c42275231402254eb8763518af13f)
#04 pc 00000000000026c8 /system/bin/app_process64 (main+1660) (BuildId: b14db68ce588c96e5fd5907ea5196e11)
#05 pc 000000000007c5bc /data/app/~~sVIl8gpjAu-30nJoGU9W8A==/im.khad.white_pawn-8w3dnlnYIXakNgE0ywSvaA==/base.apk!libstockfish.so (stockfish_main+124) (BuildId: 49578b80340cceb3ffdb3889df3ccd3e363d0c40)
#06 pc 0000000000006694 <anonymous:7ba2480000>
Lost connection to device.
EDIT2:
Error was with the fen position itself, which led to the Stockfish chess engine to crash. So, please feel free to close the issue here.
At least for users of this package it could be an interesting insight that a fatal signal 11 error can result from the core Stockfish chess engine crashing.
EDIT:
Also the official Stockfish 15.1 Windows x64 exe crashes with this position. I have therefore opened an issue directly with the Stockfish engine here: official-stockfish/Stockfish#5071
Original post:
In my small chess app, I get the following error in rare occasions. The error will deterministically occur in my app for the position below. It keeps occurring after reinstalling app and restarting device. The app runs in debug mode.
Any indications at all on why this might be happening and why it keeps occurring for me in these specific positions.
Stockfish is ready.
Stockfish stdin: position fen 3qk1nb/1p3p2/p1r1p1p1/3p4/3P4/2N1BP2/PPPQ1P2/R3K3 w Qk - 0 15
Stockfish stdin: go movetime 3000
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/t2quew/t2q:14/UP1A.231005.007/G996U1UESAFXAB:user/release-keys'
Revision: '13'
ABI: 'arm64'
Processor: '6'
Timestamp: 2024-02-24 17:25:49.265661073+0100
Process uptime: 27s
Cmdline: com.cbt.chess_blunder_trainer
pid: 1920, tid: 2074, name: DartWorker >>> com.cbt.chess_blunder_trainer <<<
uid: 10526
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x0000006f8b0bc000
x0 000000702b2f9e08 x1 0000000000000000 x2 0000000000000000 x3 0000006f8f72f820
x4 0000000000000020 x5 0000000040100401 x6 000000000000000e x7 b40000708554fac0
x8 0000000000000010 x9 0000000000202963 x10 0000000000000038 x11 000000000000000c
x12 b400006f8b0bc000 x13 0000000000000000 x14 0000006f8f650b08 x15 b400006f8a8b1a78
x16 0000006f8f62f308 x17 0000006f8f5cbb9c x18 000000702a80a000 x19 0000000000000006
x20 0000000000000002 x21 b400006f8a8b1a70 x22 0000000000000038 x23 0000000000000005
x24 0000000000000003 x25 0000006f8f650b08 x26 000000000000000a x27 000000000000000c
x28 0000000000000004 x29 000000702b2f9f30
lr 0000006f8f5941b4 sp 000000702b2f9de0 pc 0000006f8f59424c pst 0000000080001000
7 total frames
backtrace:
#00 pc 0000000002d6c24c /data/app/~~dXfyDasKRmvqw-s_ny-r9w==/com.cbt.chess_blunder_trainer-X0a1XdmjSzGChB-ZKotDcA==/base.apk!libstockfish.so (offset 0x407f000) (Stockfish::Position::set(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, bool, Stockfish::StateInfo*, Stockfish::Thread*)+1012) (BuildId: 7b73f3d0201387c3449a2e644f7cd60fa1bafa62)
#01 pc 0000000002d8ad4c /data/app/~~dXfyDasKRmvqw-s_ny-r9w==/com.cbt.chess_blunder_trainer-X0a1XdmjSzGChB-ZKotDcA==/base.apk!libstockfish.so (offset 0x407f000) (Stockfish::ThreadPool::start_thinking(Stockfish::Position&, std::__ndk1::unique_ptr<std::__ndk1::deque<Stockfish::StateInfo, std::__ndk1::allocator<Stockfish::StateInfo> >, std::__ndk1::default_delete<std::__ndk1::deque<Stockfish::StateInfo, std::__ndk1::allocator<Stockfish::StateInfo> > > >&, Stockfish::Search::LimitsType const&, bool)+880) (BuildId: 7b73f3d0201387c3449a2e644f7cd60fa1bafa62)
#02 pc 0000000002d902f8 /data/app/~~dXfyDasKRmvqw-s_ny-r9w==/com.cbt.chess_blunder_trainer-X0a1XdmjSzGChB-ZKotDcA==/base.apk!libstockfish.so (offset 0x407f000) (BuildId: 7b73f3d0201387c3449a2e644f7cd60fa1bafa62)
#03 pc 0000000002d8e940 /data/app/~~dXfyDasKRmvqw-s_ny-r9w==/com.cbt.chess_blunder_trainer-X0a1XdmjSzGChB-ZKotDcA==/base.apk!libstockfish.so (offset 0x407f000) (Stockfish::UCI::loop(int, char**)+2572) (BuildId: 7b73f3d0201387c3449a2e644f7cd60fa1bafa62)
#04 pc 0000000002d609b0 /data/app/~~dXfyDasKRmvqw-s_ny-r9w==/com.cbt.chess_blunder_trainer-X0a1XdmjSzGChB-ZKotDcA==/base.apk!libstockfish.so (offset 0x407f000) (main+444) (BuildId: 7b73f3d0201387c3449a2e644f7cd60fa1bafa62)
#05 pc 0000000002d4ea30 /data/app/~~dXfyDasKRmvqw-s_ny-r9w==/com.cbt.chess_blunder_trainer-X0a1XdmjSzGChB-ZKotDcA==/base.apk!libstockfish.so (offset 0x407f000) (stockfish_main+68) (BuildId: 7b73f3d0201387c3449a2e644f7cd60fa1bafa62)
#06 pc 0000000000007bc4 [anon:dart-code]
Lost connection to device.
Exited.
The position is from the following game:
[Event "Live Chess"]
[Site "Chess.com"]
[Date "2024.02.17"]
[Round "-"]
[White "only_strong_moves"]
[Black "Hikaru"]
[Result "0-1"]
[CurrentPosition "3q4/1p1k1p2/p3p1p1/1n1pP3/8/1P3PN1/P1rQKP2/7R w - -"]
[Timezone "UTC"]
[ECO "A00"]
[ECOUrl "https://www.chess.com/openings/Van-Geet-Opening-Myers-Attack"]
[UTCDate "2024.02.17"]
[UTCTime "19:05:42"]
[WhiteElo "2699"]
[BlackElo "3282"]
[TimeControl "180"]
[Termination "Hikaru won by resignation"]
[StartTime "19:05:42"]
[EndDate "2024.02.17"]
[EndTime "19:07:16"]
[Link "https://www.chess.com/game/live/101935573871"]
- Nc3 {[%clk 0:03:00]} 1... g6 {[%clk 0:03:00]} 2. h4 {[%clk 0:02:59.6]} 2... Bg7 {[%clk 0:02:59.9]} 3. h5 {[%clk 0:02:59.2]} 3... d5 {[%clk 0:02:59.8]} 4. hxg6 {[%clk 0:02:58.4]} 4... hxg6 {[%clk 0:02:57.5]} 5. Rxh8 {[%clk 0:02:58.3]} 5... Bxh8 {[%clk 0:02:57.3]} 6. e3 {[%clk 0:02:57.9]} 6... c5 {[%clk 0:02:54]} 7. Nf3 {[%clk 0:02:57.3]} 7... Nc6 {[%clk 0:02:53.3]} 8. d4 {[%clk 0:02:56.4]} 8... Bg4 {[%clk 0:02:52.1]} 9. Bb5 {[%clk 0:02:54]} 9... cxd4 {[%clk 0:02:48.6]} 10. exd4 {[%clk 0:02:51.1]} 10... Rc8 {[%clk 0:02:48.1]} 11. Be3 {[%clk 0:02:49.7]} 11... e6 {[%clk 0:02:45.9]} 12. Qd2 {[%clk 0:02:42.6]} 12... Bxf3 {[%clk 0:02:45.2]} 13. gxf3 {[%clk 0:02:42.5]} 13... a6 {[%clk 0:02:44.6]} 14. Bxc6+ {[%clk 0:02:41.5]} 14... Rxc6 {[%clk 0:02:44]} 15. Ne2 {[%clk 0:02:38.6]} 15... Ne7 {[%clk 0:02:42.8]} 16. Ng3 {[%clk 0:02:36.9]} 16... Nc8 {[%clk 0:02:40.2]} 17. Ke2 {[%clk 0:02:27.6]} 17... Nd6 {[%clk 0:02:38.5]} 18. Rh1 {[%clk 0:02:26.3]} 18... Bf6 {[%clk 0:02:36.4]} 19. b3 {[%clk 0:02:14.6]} 19... Kd7 {[%clk 0:02:34.2]} 20. Bf4 {[%clk 0:02:12.7]} 20... Nb5 {[%clk 0:02:32.7]} 21. Be5 {[%clk 0:02:09.1]} 21... Bxe5 {[%clk 0:02:31.5]} 22. dxe5 {[%clk 0:02:09]} 22... Rxc2 {[%clk 0:02:31.1]} 0-1
When trying to compile the project using flutter build apk --split-per-abi
the build fails with the following output:
build_err.log
flutter doctor
returns:
flutter_doctor.txt
Using the manual installation the build works just fine. It seems to be a problem with the snap version of flutter and not with this project. But still it would be interesting to know, if someone here knows any specifics.
By the way, the bug was first seen in the new mobile version of the lichess app (lichess-org/mobile#123)
In rare cases, it seems that a mix up of characters from stdin commands can occur in 1.4.0, when these are transmitted directly one after the other:
Specifically, I observed the following situation on a Galaxy S21 5G
Code:
this.stockfishInstance!.stdin = "ucinewgame";
this.stockfishInstance!.stdin = "stop";
Result
Unknown command: 'uinewgame'. Type help for more information.
Unknown command: 'cstop'. Type help for more information.
I have triple checked, there is no way my part of the code could have initiated these miss-typed commands. Therefore, I assume they got mixed up within the stockfish package as a result from them being provided in short sequence after each other.
Does this make sense? Has anyone had a similar experience like this one? Do you have any advice how to prevent this? I thought about delaying the next command by a few milliseconds?
Is there a way to fix that without downgrading or uninstalling shared_preferences ?
[eight_times_eight] flutter pub get
Running "flutter pub get" in eight_times_eight...
Because every version of stockfish depends on ffi ^0.1.3 and path_provider_windows >=0.1.0-nullsafety.3 depends on ffi ^1.0.0, stockfish is incompatible with path_provider_windows >=0.1.0-nullsafety.3.
And because shared_preferences_windows 2.0.0 depends on path_provider_windows ^2.0.0, stockfish is incompatible with shared_preferences_windows 2.0.0.
Because no versions of shared_preferences_windows match >2.0.0 <3.0.0 and shared_preferences >=2.0.0 depends on shared_preferences_windows ^2.0.0, shared_preferences >=2.0.0 requires shared_preferences_windows 2.0.0.
Thus, stockfish is incompatible with shared_preferences >=2.0.0.
So, because white_pawn depends on both shared_preferences ^2.0.6 and stockfish ^0.0.3, version solving failed.
pub get failed (1; So, because white_pawn depends on both shared_preferences ^2.0.6 and stockfish ^0.0.3, version solving failed.)
exit code 1
Both go infinite
and go movetime 3000
crash the app on iOS. I think this may be a threading issue.
They work fine on Android though.
Hi, thanks for you awesome work.
I'm currently using your lib on a flutter app and it used to work perfectly.
I did a Flutter upgrade,
Suddenly, it started to crash when I'm calling stockfish.stdin("go movetime 1000");
This code used to work, I tried to go to previous stable version, to switch devices, to clean, upgrade the package to 1.4.0 etc, nothing to do.
The error is this one :
D/HostConnection(17158): createUnique: call D/HostConnection(17158): HostConnection::get() New Host Connection established 0xb400007178a660d0, tid 17424 D/HostConnection(17158): HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_vulkan_queue_submit_with_commands ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri ANDROID_EMU_read_color_buffer_dma ANDROID_EMU_hwc_multi_configs GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 F/libc (17158): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x30 in tid 17186 (1.ui), pid 17158 (lblindfoldchess)
I don't know from where it comes.
Thank you again.
regards,
Anatole
Is there any method implemented to get the current version of the engine (i.e. Stockfish 15.1) or should you use the "engine identify" UCI command for this? In the first attempt this did not work for me?
Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...
FAILURE: Build failed with an exception.
No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org
BUILD FAILED in 4m 58s
Exception: Gradle task assembleDebug failed with exit code 1
Exited (sigterm)
hi, i try to run example in this project but i face this issue
Bad state: Stockfish is not ready (StockfishState.error)
flutter doctor
[✓] Flutter (Channel stable, 3.10.2, on Microsoft Windows [Version 10.0.18363.592], locale en-US)
• Flutter version 3.10.2 on channel stable at E:\Installers\flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision 9cd3d0d9ff (4 months ago), 2023-05-23 20:57:28 -0700
• Engine revision 90fa3ae28f
• Dart version 3.0.2
• DevTools version 2.23.1
build gradle
android {
compileSdkVersion 33
ndkVersion "23.1.7779620"
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
any workaround for this ?
thank you
That is the error I get, whenever I try to simply initialize stockfish in my application.
After initializing in the MyApp class, I then tried to play around with variations of the following:
waitUntilReady();
stockfish.stdin = 'isready';
stockfish.stdin = 'go movetime 3000';
stockfish.stdin = 'go infinite';
stockfish.stdin = 'stop';
waitUntilReady();
stockfish.stdout.listen(
(event) => print(event),
);
Similar issue with the example code from the documentation:
Bad state: Stockfish is not ready (StockfishState.error)
Is there a possibility to fix without downgrading ndk ?
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':stockfish'.
> No version of NDK matched the requested version 20.0.5594570. Versions available locally: 22.0.7026061
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 13s
I got an issue on go
-command. It is working but the stdout stream is not dispatching the new lines.
When I trigger hot-reload all lines will be dispatched afterwards.
Any ideas on that ? :)
On isready
its working well! 👍
Is there a way to directly change the state of the game to a FEN position?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.