philipk / boilr Goto Github PK
View Code? Open in Web Editor NEWSynchronize games from other platforms into your Steam library
License: Apache License 2.0
Synchronize games from other platforms into your Steam library
License: Apache License 2.0
Using v.0.9.22 of BoilR
Some games seem to be creating two shortcuts. Others are not.
I deleted all the shortcuts created by previous runs. Ran UI sync. Restarted Steam.
Hades and Rocket Legue created 2 shortcuts.
Chicory, Horace, PikuNiku and Superbrothers Sword and Sworcery just created 1.
Interestingly A Short Hike was creating 2 shortcuts. I uninstalled it through Heroic, deleted both shortcuts and then ran BoilR again and it has created just one shortcut. The shortcut points to /home/deck/games/Heroic/AShortHike/AShortHike.exe but I browsed to that directory and that .exe doesn't exist. There is a file AShortHike.dxvk-cache in there but that's it.
CI scripts need to be updated. They should compile for both aarch64-apple-darwin and x86_64-apple-darwin on a macos-latest machine.
While updating the AUR package I noticed that the latest version introduced a failing test.
The changelog of 0.9.15 indicates that there where indeed changes to the EGS shortcuts
Fix issue where duplicated shortcuts could be added for Epic Games.
warning: unused import: `std::path::PathBuf`
--> src/heroic/heroic_platform.rs:6:5
|
6 | use std::path::PathBuf;
| ^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: `boilr` (bin "boilr" test) generated 1 warning
Finished test [unoptimized + debuginfo] target(s) in 0.10s
Running unittests (target/debug/deps/boilr-2ba8f4c33a2310a6)
running 12 tests
test egs::manifest_item::tests::can_parse_item ... ok
test egs::manifest_item::tests::generates_launch_string ... ok
test egs::manifest_item::tests::generates_shortcut_managed ... ok
test egs::manifest_item::tests::generates_shortcut_with_dlc ... ok
test lutris::game_list_parser::tests::reads_id ... ok
test lutris::game_list_parser::tests::can_parse_output ... ok
test lutris::game_list_parser::tests::reads_index ... ok
test lutris::game_list_parser::tests::reads_platform ... ok
test lutris::game_list_parser::tests::reads_name ... ok
test itch::butler_db_parser::tests::parse_itch_butler_db_test ... ok
test itch::butler_db_parser::tests::parse_itch_butler_db_test_other ... ok
test egs::manifest_item::tests::generates_shortcut_not_managed ... FAILED
failures:
---- egs::manifest_item::tests::generates_shortcut_not_managed stdout ----
thread 'egs::manifest_item::tests::generates_shortcut_not_managed' panicked at 'assertion failed: `(left == right)`
left: `"C:\\Games\\MarvelGOTG/retail/gotg.exe"`,
right: `"\"C:\\Games\\MarvelGOTG/retail/gotg.exe\""`', src/egs/manifest_item.rs:151:9
stack backtrace:
0: 0x561eb71c61ac - std::backtrace_rs::backtrace::libunwind::trace::hc419169bf6ef9454
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
1: 0x561eb71c61ac - std::backtrace_rs::backtrace::trace_unsynchronized::h9d59fe14733c6869
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
2: 0x561eb71c61ac - std::sys_common::backtrace::_print_fmt::h7b4753f1990145e4
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys_common/backtrace.rs:67:5
3: 0x561eb71c61ac - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::he933bf90d5f823a3
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys_common/backtrace.rs:46:22
4: 0x561eb71ebabc - core::fmt::write::h4f22e68bd4c318cf
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/fmt/mod.rs:1168:17
5: 0x561eb71c1233 - std::io::Write::write_fmt::h592a6d7050d8d741
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/io/mod.rs:1660:15
6: 0x561eb71c8882 - std::sys_common::backtrace::_print::h53eaa013323ce8bd
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys_common/backtrace.rs:49:5
7: 0x561eb71c8882 - std::sys_common::backtrace::print::hddd71819e54744d2
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys_common/backtrace.rs:36:9
8: 0x561eb71c8882 - std::panicking::default_hook::{{closure}}::ha7bb60f433497f90
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:211:50
9: 0x561eb71c84d1 - std::panicking::default_hook::he08c1b6dbe4ebf2d
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:225:9
10: 0x561eb71c8ed3 - std::panicking::rust_panic_with_hook::h4a7addec02e7dc8c
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:606:17
11: 0x561eb71c8bf0 - std::panicking::begin_panic_handler::{{closure}}::hd61a91341efd4038
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:502:13
12: 0x561eb71c6654 - std::sys_common::backtrace::__rust_end_short_backtrace::hf785c5cc16e3ea16
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys_common/backtrace.rs:139:18
13: 0x561eb71c8929 - rust_begin_unwind
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:498:5
14: 0x561eb71131e1 - core::panicking::panic_fmt::ha2f5c0f1190ddcde
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/panicking.rs:107:14
15: 0x561eb71ea668 - core::panicking::assert_failed_inner::h7483db813f019ac1
16: 0x561eb713084e - core::panicking::assert_failed::hc337a68081ad4721
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/panicking.rs:145:5
17: 0x561eb7132cac - boilr::egs::manifest_item::tests::generates_shortcut_not_managed::h756c52deb5a0b8f0
at /home/jrt/repos/arch/steam-boilr-gui/src/BoilR-v.0.9.15/src/egs/manifest_item.rs:151:9
18: 0x561eb7116b0a - boilr::egs::manifest_item::tests::generates_shortcut_not_managed::{{closure}}::hccec71297ebb78a0
at /home/jrt/repos/arch/steam-boilr-gui/src/BoilR-v.0.9.15/src/egs/manifest_item.rs:141:5
19: 0x561eb711764e - core::ops::function::FnOnce::call_once::h7a2319120345644b
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/ops/function.rs:227:5
20: 0x561eb715ed23 - core::ops::function::FnOnce::call_once::h53fdc358bc7dbf8c
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/ops/function.rs:227:5
21: 0x561eb715ed23 - test::__rust_begin_short_backtrace::h6d54b178308621f8
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/test/src/lib.rs:574:5
22: 0x561eb715da1f - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h69fe35f25d93ce2e
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/alloc/src/boxed.rs:1854:9
23: 0x561eb715da1f - <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::hb6794449d6bdd6a4
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/panic/unwind_safe.rs:271:9
24: 0x561eb715da1f - std::panicking::try::do_call::h86ecae378ef4ecea
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:406:40
25: 0x561eb715da1f - std::panicking::try::h8a739f411eba0aeb
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:370:19
26: 0x561eb715da1f - std::panic::catch_unwind::h51bf51d338d95b3e
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panic.rs:133:14
27: 0x561eb715da1f - test::run_test_in_process::h62f855143a5ac361
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/test/src/lib.rs:597:18
28: 0x561eb715da1f - test::run_test::run_test_inner::{{closure}}::hc671f96ce76fa8f7
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/test/src/lib.rs:491:39
29: 0x561eb7166d81 - test::run_test::run_test_inner::{{closure}}::h53eb8d36bf6dafad
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/test/src/lib.rs:518:37
30: 0x561eb7166d81 - std::sys_common::backtrace::__rust_begin_short_backtrace::h77ad2a047f7bf9c7
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys_common/backtrace.rs:123:18
31: 0x561eb713375f - std::thread::Builder::spawn_unchecked::{{closure}}::{{closure}}::h2a3ec89bda1527ac
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/thread/mod.rs:477:17
32: 0x561eb713375f - <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::h60d3d0a54fd22b12
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/panic/unwind_safe.rs:271:9
33: 0x561eb713375f - std::panicking::try::do_call::hebf146641056d110
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:406:40
34: 0x561eb713375f - std::panicking::try::h3f99ff28acdfc3ff
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panicking.rs:370:19
35: 0x561eb713375f - std::panic::catch_unwind::h228c651b1ce4aa64
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/panic.rs:133:14
36: 0x561eb713375f - std::thread::Builder::spawn_unchecked::{{closure}}::ha5e99c5cc3fc7122
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/thread/mod.rs:476:30
37: 0x561eb713375f - core::ops::function::FnOnce::call_once{{vtable.shim}}::h140fa784255088e8
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/core/src/ops/function.rs:227:5
38: 0x561eb71cea63 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h2f7659ee59dd0ada
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/alloc/src/boxed.rs:1854:9
39: 0x561eb71cea63 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h95b83a7b24076276
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/alloc/src/boxed.rs:1854:9
40: 0x561eb71cea63 - std::sys::unix::thread::Thread::new::thread_start::h1cd6c1faf6f6ab03
at /rustc/28c8a34e18fc05277c81328d1bbf5ed931f4d22e/library/std/src/sys/unix/thread.rs:108:17
41: 0x7f455d9695c2 - start_thread
42: 0x7f455d9ee584 - __clone
43: 0x0 - <unknown>
failures:
egs::manifest_item::tests::generates_shortcut_not_managed
test result: FAILED. 11 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
error: test failed, to rerun pass '--bin boilr'
If Origin gets installed through proton, BoilR does not find the installed games.
I’m an absolute beginner with Linux so this is probably obvious but: I got my Steam Deck today. Downloaded and installed Heroic games launcher and downloaded a couple of games from Epic (intend to also use gog). Ran the UI variant of BoilR and it synced (found a spelling error here, the UI says “synched”). Games show up in Steam but doesn’t launch when I hit play. What am I missing?
It is possilbe to set a wide grid image that will be used by steam when you hover over an image or it is in the "recently used" games.
The image must simply be named 2975066107.png where the normal grid image is named 2975066107p.png and the hero is named 2975066107_hero.png .
It is possible to search for that specific image size on steamgrid db.
Set up a section in the configuration file (and the UI) that lets users select preferences for which images to download.
This could include image types, sizes and so on.
Any chance we could also get macOS binaries for BoilR?
I use Game Backup Monitor as the launcher for my games. Especially useful for older games. Would it be possible to add game importing from GBM to Steam?
Add support for finding GoG games installed using heroic.
Not sure if this would even be possible, but it could be very useful to put "epic games" in a steam library catagory named "epic" automagically!
Hi so I have an issue with getting GOG Galaxy to work through Lutris, it just doesn't want to launch at all. But there is this launcher called MiniGalaxy that works wonders installing native Linux games even if they don't work with any other option like Lutris(At least Hyper Light Drifter only works for me on the steam deck with minigalaxy)
So adding support for mini galaxy would be amazing as it sadly doesn't add shotcuts to the start menu or anything.
Steamdeck, Heroic/Flatpack/Epic, BoilR v.0.9.22 using SteamGrid api key
The images downloaded for the shortcuts in the small library on the left are the incorrect aspect ratio.
Also some things like Emulators have automatically picked up artwork for the banner/large icons but have no icon for the small library (e.g. Dolphin in my screenshot)
Currently the Origin integration simply sets the "launch" parameter to the origin launch url.
To make this work on linux, it needs to call proton give it the origin exe and then give that the url instead.
Instead of assuming the path of epic game store it can be found in the windows registry here:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Epic Games\EpicGamesLauncher AppDataPath
You can manually change the name of a game to its AppID which allows access to community gamepad configs. You can then save one config as your own and then rename it back to its original name. Is it possible to automate that process and incorporate it into that tool?
This might not even be possible, but it is worth a shot.
The current UI is hard to parse and does not scale with more and more platforms being added.
There's also fulll-featured "Rare" client:
https://github.com/Dummerle/Rare
It's uses Qt and takes 5MB on HDD (vs 480M for Heroic bloatware)
The readme mentions that Heroic is supported but the config examples don't show what needs to be added and the GUI doesn't show it as an option. Are there instructions on how to do that?
(I am using Heroic installed via Discover/flatplack on Steam Deck)
When multiple users are present on the machine it will pick the user with the lowest user ID and add the games to that account.
I don't see a way to specify a user, so I'm assuming this functionality doesn't exist.
I'm using it on Steam Deck, but you can test it on steamOS and Big Picture on Windows also has a multi user mode if I remember correctly.
Downloaded rocket league on heroic and when launching it from desktop mode seemed to work fine. However, when boilr made a launch app for it within steam, it would not launch. It would look like its launching for a second then revert back to steam library. Within the boilr UI, legendary and heroic are checked if that matters. Boilr for itch.io games works perfect though so thanks for that.
If Uplay gets installed through proton, then BoilR cannot find the games.
Make an integration to GoG Galaxy
Two possible ways:
UI doesn't seem to work: When compiling with the UI feature it complains about a libfltk file not being compatible with the arm64 architecture (Apple Silicon). Running cargo update doesn't fix this. It might be that I need to install some dependencies before trying to build locally.
Using Windows GUI version, I'm getting this message in the command-prompt: "Setting for platform Lutris are invalid, reason: program not found"
I'm not sure if it has any tangible effect, but I'm unable to disable Lutris in the GUI, in order to make the error-message disappear
Some games frail to launch when starting them from steam.
They simply state that you must "please launch form the epic launchers" and then crash.
The assumed solution is to launch the game using an epic uri:
com.epicgames.launcher://apps/b671fbc7be424e888c9346a9a6d3d9db%3A38c07a09dc174b69b756aa51890c3dd4%3ASalt?action=launch&silent=true
The uri can be put together from the manifest files that are in:
C:\ProgramData\Epic\EpicGamesLauncher\Data\Manifests
The current problem is that it is unknown how to distinguish these games from the others.
"Kingdom Hearts" and "Final Fantasy VII Remake Integrade" have been reproted to be problematic here:
https://www.reddit.com/r/SteamDeck/comments/rocj1c/gog/hq4bpb2/?context=8&depth=9
Every time Bolir is ran, it creates duplicates of itch.io games that are already in the library.
Hi! Just found this awesome tool. I have a couple of emulated Wii games in my Steam library, and BoilR seems to get stuck on not being able to find images on them (or something, the command line output doesn't tell me what it's doing past "searching"). Am I doing something wrong?
(First issue i ever reported so sorry if it's gonna be a bit chaotic)
Version used: v0.9.0
Tested on: Steam Deck - SteamOS3
Upon running the "linux_BoilR" binary in Konsole, after allowing it to be executable, i got the following output:
Found 1 user(s)
Found 25 shortcuts for user: /home/deck/.steam/steam/userdata/--------- (edited out my user number)
thread 'main' panicked at 'called Result::unwrap() on an Err value: Utf8Error { valid_up_to: 33, error_len: Some(1) }', src/itch/butler_db_parser.rs:33:55
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
I do get the same output when running "linux_ui_BoilR" too. The settings were set up like i did on my Arch install where it worked seemingly as supposed to be.
Googling the error message didn't get me far as I'm neither versed in rust and installing packages manually on steamOS is advised against due to the nature of updates having the possibilty to undo packages that may be installed manually via pacman on SteamOS.
I had a .DS_STORE file in my /Steam/userdata/ folder, and BoilR was crashing until I deleted it manually. BoilR should ignore .DS_STORE files, because it's normal for macOS to generate those.
Hi there,
Great software, it can be even better if you could implement few more things.
This might be a lot, but it will help greatly.
Thank you for your effort.
Since the Steam Deck comes with Flathub enabled and Discover pre-installed, It would be really nice to have the GUI build of BoilR available on Flathub.
Hi,
Because SteamDeck's root filesystem is r/o and get's overwritten every upgrade, its encouraged that everything installed outside of SteamStore be provided as FlatPaks (there's 'Discover' already in 'desktop mode' pinned to taskbar for easy installation)
I don't want Heroic, which is nearly 500MB BloatWare (in comparison to your's 5MB client)
This might well just be a limitation of Steam or whatever method you are using to add shortcuts to it, but it would be cool if you could some how refresh the Steam library after syncing without having to exit and re-open Steam.
Feel free to close if this isn't possible.
hey! thanks for building this, i'm getting 'no images needed' and no images in the steam, is there anything i need to change?
the games definitely exist on steamgriddb (eg snowrunner, hades, & battlefield v)
Found 1 user(s)
Found 5 shortcuts for user: C:\Program Files (x86)\Steam\userdata\{redacted idk if it's sensitive}
Found 4 game(s) for platform EGS
Found 1 game(s) for platform Origin
Saved 5 shortcuts
Finished synchronizing games in: 1.4165ms
Checking for game images
No images needed```
Games affected in my testcase: Underhero and HiveTime
For HiveTime a link to a non-existing file is being created: ~/.config/itch/apps/underhero/hive-time_linux_V1.2.x86_64
(The HiveTime executable isn't in the directory for the game Underhero)
This game shows up in steam as Underhero with a non-BoilR link to the non-existent executable.
For Underhero itself BoilR seems to grab the wrong executable and links to the "UnityPlayer_s.debug" file in the directory of the game (~/.config/itch/apps/underhero/Linux/)
This game shows up as Underhero as well with a normal BoilR link.
I reran BoilR several times after deleting the entries from steam itself a few times as well, deleted cache.json once (just in case it could have been interfering with it and to force a new scraping of the artwork)
I've tried BoilR on "Cities: Skylines" and "A Plague Tale: Innocence"
Cities: https://www.steamgriddb.com/game/3192
A Plague Tale: Innocence: https://www.steamgriddb.com/game/23490
Looking at the images below, it seems the icons steamgriddb is calling "Client Icons" are not downloaded, but instead a wide image is chosen.
Also, it's not always the case that the hero image is downloaded, and when it is downloaded, it's not the image that is the default image, according to steamgriddb. Try clicking on the "View Original Steam Assets" button and see what steamgriddb thinks should be used
Downloading and searching can be done in parallel (since they are async), but it should be done in batches to not spam SteamGridDB.
Setting for platform Legendary are invalid, reason: No such file or directory (os error 2)
Found 4 game(s) for platform Itch
Setting for platform Lutris are invalid, reason: No such file or directory (os error 2)
Found 1 game(s) for platform Heroic
Found 2 user(s)
thread 'tokio-runtime-worker' panicked at 'called Result::unwrap()
on an Err
value: ParseIntError { kind: Empty }', /home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/steam_shortcuts_util-1.1.4/src/shortcuts_parser.rs:206:47
note: run with RUST_BACKTRACE=1
environment variable to display a backtrace
This is what the console outputs when running the script.
Show synchronization progress in the UI
Firstly thanks for creating such a great application
Using GUI version and it never seems to complete.
If I click on the GUI once it begins it locks up
Found 5 user(s)
Found 69 shortcuts for user: C:\Program Files (x86)\Steam\userdata\311838003
Error getting shortcuts from platform: Legendary
The system cannot find the file specified. (os error 2)
Found 40 game(s) for platform Origin
Found 1 game(s) for platform Gog
Saved 69 shortcuts
Finished synchronizing games in: 43.2475ms
Found 69 shortcuts for user: C:\Program Files (x86)\Steam\userdata\53868787
Error getting shortcuts from platform: Legendary
The system cannot find the file specified. (os error 2)
Found 40 game(s) for platform Origin
Found 1 game(s) for platform Gog
Saved 69 shortcuts
Finished synchronizing games in: 11.0708ms
Found 74 shortcuts for user: C:\Program Files (x86)\Steam\userdata\60957330
Error getting shortcuts from platform: Legendary
The system cannot find the file specified. (os error 2)
Found 40 game(s) for platform Origin
Found 1 game(s) for platform Gog
Saved 74 shortcuts
Finished synchronizing games in: 9.6156ms
Found 69 shortcuts for user: C:\Program Files (x86)\Steam\userdata\81110563
Error getting shortcuts from platform: Legendary
The system cannot find the file specified. (os error 2)
Found 40 game(s) for platform Origin
Found 1 game(s) for platform Gog
Saved 69 shortcuts
Finished synchronizing games in: 10.7668ms
Found 69 shortcuts for user: C:\Program Files (x86)\Steam\userdata\ac
Error getting shortcuts from platform: Legendary
The system cannot find the file specified. (os error 2)
Found 40 game(s) for platform Origin
Found 1 game(s) for platform Gog
Saved 69 shortcuts
Finished synchronizing games in: 11.8046ms
Checking for game images
Searching for AMAZONS
Searching for HITMAN 2 Standard
Searching for Metro Exodus Enhanced Edition
Searching for A Total War Saga: TROY
Searching for Ticket to Ride
Searching for Sam's Story Enhanced Edition
Searching for HITMAN 2 Expansion
Searching for Sid Meier's Civilization VI
Searching for HITMAN 1 GOTY Upgrade
Searching for Carcassonne
Searching for AMAZONS
Searching for HITMAN 2 Standard
Searching for Metro Exodus Enhanced Edition
Searching for A Total War Saga: TROY
Searching for Ticket to Ride
Searching for Sam's Story Enhanced Edition
Searching for HITMAN 2 Expansion
Searching for Sid Meier's Civilization VI
Searching for HITMAN 1 GOTY Upgrade
Searching for Carcassonne
Searching for Total War: Attila
Searching for Apex (Origin)
Searching for GTA V Rage
Searching for Escape from Tarkov
Searching for HITMAN 3
Searching for AMAZONS
Searching for HITMAN 2 Standard
Searching for Metro Exodus Enhanced Edition
Searching for A Total War Saga: TROY
Searching for Ticket to Ride
Searching for AMAZONS
Searching for HITMAN 2 Standard
Searching for Metro Exodus Enhanced Edition
Searching for A Total War Saga: TROY
Searching for Ticket to Ride
Searching for Sam's Story Enhanced Edition
Searching for HITMAN 2 Expansion
Searching for Sid Meier's Civilization VI
Searching for HITMAN 1 GOTY Upgrade
Searching for Carcassonne
Searching for AMAZONS
Searching for HITMAN 2 Standard
Searching for Metro Exodus Enhanced Edition
Searching for A Total War Saga: TROY
Searching for Ticket to Ride
Searching for Sam's Story Enhanced Edition
Searching for HITMAN 2 Expansion
Searching for Sid Meier's Civilization VI
Searching for HITMAN 1 GOTY Upgrade
Searching for Carcassonne
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.