billforsternz / tarrasch-chess-gui Goto Github PK
View Code? Open in Web Editor NEWA portable, simple, desktop workbench for chess players and analysts
License: MIT License
A portable, simple, desktop workbench for chess players and analysts
License: MIT License
Would it be possible to include an icon file somewhere here on github? I'm using Devuan and don't know of any way to select an icon from the .exe, for use on the launcher. But I can browse the file system for an icon file.
Please add a feature through which the piece set can be changed to the ones of chess.com or Lichess. If we can do this, please tell me how.
I've tried several online viewers and two Chrome extensions but none displays Tarrasch CSS styles.
I'd love the move symbols (! ? !? etc.) and the evaluation symbols (+- += etc.) to be in submenus after a context-click. Users have some scrolling to do in the context menu to reach the evaluation symbols, so a submenu would save some seconds. And if the move and evaluation symbols were in submenus, then submenus for standard editing (cut, copy etc), and variation editing (promote variation, delete variation, etc.) could also be submenued.
The text editing and variation editing commands have their keyboard shortcuts, yes, but chess writers spend more time with the mouse than other writers do. Mousing moves, and clicking in the move list at an annotation point, for instance.
I don't know what log.pgn is logging. Nothing in webpage Features section about it.
Then multiple log files are in home folder, but a Logs folder would be tidy.
[Variant "From Position"]
[FEN "5rk1/4R2R/5r2/8/8/8/5PPP/6K1 w - - 0 1"]
1. Rg7+
File
→ Open
and select the fileThe program should either:
Installed your latest update. When opening program I get message "Cannot open c:\Program Files(x86)\Tarrasch\book.pgn_compiled for writing" Also can't make engine use the book.pgn at all. Kibitzer mode shows engine thinking of the normal book moves, but it never makes them. Also when making engine think for some number of seconds, I don't know which box to type in the time. There are two boxes that will accept different numbers. Why two boxes. I only need one that will accept 5, 10, 15, etc seconds.
Is it possible when the engine is kibitzing to show an arrow for the suggested next move on the playing side?
For example if it suggests for White to open up with King's pawn at E4, before the white move is made, it will show a green arrow pointing from the pawn in E2 towards E4.
It would make it much more user friendly when training if it's not really hard to implement.
RE: Source code (tar.gz) [] (2021-01-21T04:21:20Z)
https://github.com/billforsternz/tarrasch-chess-gui/archive/refs/tags/tarrasch-v3.13b.tar.gz
I previously compiled this with g++-8 without warnings, but on a newer machine with g++-12 I received the following from make:
g++ -c -g -std=c++11 `wx-config --cxxflags` Tabs.cpp -o Tabs.o
g++ -c -g -std=c++11 `wx-config --cxxflags` thc.cpp -o thc.o
thc.cpp: In member function ‘void thc::ChessEvaluation::Planning()’:
thc.cpp:4481:15: warning: ‘void* memcpy(void*, const void*, size_t)’ reading 512 bytes from a region of size 256 [-Wstringop-overread]
4481 | memcpy( king_ending_bonus_dynamic_white,
| ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4482 | king_ending_bonus_static,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
4483 | sizeof(king_ending_bonus_dynamic_white) );
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
thc.cpp:4325:12: note: source object ‘king_ending_bonus_static’ of size 256
4325 | static int king_ending_bonus_static[] =
| ^~~~~~~~~~~~~~~~~~~~~~~~
thc.cpp:4484:15: warning: ‘void* memcpy(void*, const void*, size_t)’ reading 512 bytes from a region of size 256 [-Wstringop-overread]
4484 | memcpy( king_ending_bonus_dynamic_black,
| ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4485 | king_ending_bonus_static,
| ~~~~~~~~~~~~~~~~~~~~~~~~~
4486 | sizeof(king_ending_bonus_dynamic_black) );
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
thc.cpp:4325:12: note: source object ‘king_ending_bonus_static’ of size 256
4325 | static int king_ending_bonus_static[] =
| ^~~~~~~~~~~~~~~~~~~~~~~~
g++ -c -g -std=c++11 `wx-config --cxxflags` TournamentDialog.cpp -o TournamentDialog.o
g++ -c -g -std=c++11 `wx-config --cxxflags` TrainingDialog.cpp -o TrainingDialog.o
Looking at the code you have
It seems you use the dynamic arrays with only actual squares, so I resized them to [0x40] and compiled without warnings.
$ diff thc.cpp.0 thc.cpp
4348,4349c4348,4349
< static int king_ending_bonus_dynamic_white[0x80];
< static int king_ending_bonus_dynamic_black[0x80];
---
> static int king_ending_bonus_dynamic_white[0x40];
> static int king_ending_bonus_dynamic_black[0x40];
And so far Tarrasch didn't crash. :)
Tarrasch v. 3.13b+
Ubuntu v. 20.04
Maybe there's a bug, but it doesn't affect usability.
*** BUG ***
In pixman_region32_init_rect: Invalid rectangle passed
Set a breakpoint on '_pixman_log_error' to debug
I had hoped to use Tarrasch to analyze some Chess960 games. Because the start position is not standard, the header includes a FEN for the initial position. Like this:
[Event "Chess.com 960 friendly"]
[Site "Chess.com iPhone"]
[Date "2022.12.31"]
[Round "?"]
[White "dyado72"]
[Black "fizixgeek"]
[Result "1-0"]
[FEN "qrnknbbr/pppppppp/8/8/8/8/PPPPPPPP/QRNKNBBR w HBhb - 0 1"]
[WhiteElo "920"]
[BlackElo "1457"]
When I load in Tarrasch, it shows the standard opening position and can only play a few moves before reaching an illegal move and getting stuck.
This feature request is for support for FEN in .pgn headers.
\src\thc.cpp line 7467 + 7817
should be probably &&
if( '1'<=dst_rank || dst_rank<='8' )
I don't care that I can't change text color in the moves window. (I use Sublime Text, for which a bajillion color schemes are available, so I get more than enough choices in changing text color). I even like the default blue. But the highlighted text color has to be made darker.
The text highlight is so light that the selected, reversed text can't be seen. If I can do that at the system level, I can't find it in Ubuntu or Elementary OS forums (where the users are all concerned with changing system colors).
Sure, the highlighted text is only unreadable until any user action undoes the highlight, but while editing text, a writer will sit and stare at highlighted text for minutes, because that's the text he's thinking about changing.
I have the "change the size of text, apps, and other items" option on Windows 11 at 125% and it causes the text in the program to be slightly blurred. Setting "Tarrasch.exe"->"Properties"->"Compatibility"->"Change high DPI settings"->"Override high DPI scaling behavior" to "Application" fixes this, but makes the icons smaller.
I have a few suggestions for making a nicer UI:
A) Use nicer icons.
There are many many nice icon packs around nowadays, many are SVG so they could be rasterized / rendered to any size. It would be nice to use some nice modern high-res ones. Just googling:
Ionicons - Flat Icons - Font Awesome - FontEllo - Icomoon (all free for OSS & commercial use, AFAICT)
If you have some custom icons you'd like to use, maybe you could even get them crowd sourced by a generous designer.
B) Allow more font options
Currently there seems to be only "Use larger font in move window". It would be nice to be able to select a font using a font dialogue, and especially a font size. In this image,
You can see the font for "2 book moves" in the green button looks horrible, and I don't think the small bolded font for the moves is especially readable. You could either look to implementing the nicest default fonts for modern OS's (e.g Windows uses Segio UI for most stuff) and/or have a default font, you can get plenty of free/OSS ones from Google Fonts
C) Allow the move listing window to list fonts numbered down the page orderly, like
etc, with sub-lines coming up in between the main lines, perhaps slightly indented. E.g you can see BabasChess using this style here.
Cheers, happy new year
I would like to make a feature request for hotkeys for ‘Capture Top’ and ‘Capture All’.
Tarrasch is a great chess gui.
Is there any plan to support chinese character?
thx a lot.
It's almost impossible to move the dialogue around, interact with it, click on close or cancel etc, ALT+TAB back and forth between it and other windows, while it is working.
Maybe it is a situation where the work could be done on a separate thread, so the GUI dialogue itself remains responsive? (I am guessing at a solution)
For now it's sort of off-putting for a new user, when they first start the program up, and this dialogue is there but seems to be non-interactable.
You may also want to have a Wizard-style "first run" dialogue, or just something to say "Tarrasch is now going to generate a whole lot of stuff on its first run, please be patient" to inform the user why this big load is going to happen / happening.
frisco@galliumos:~/tarrasch-chess-gui$ make
make -C src
make[1]: Entering directory '/home/frisco/tarrasch-chess-gui/src'
g++ -c -g -std=c++11 wx-config --cxxflags
Book.cpp -o Book.o
g++ -c -g -std=c++11 wx-config --cxxflags
MemoryPositionSearch.cpp -o MemoryPositionSearch.o
g++ -c -g -std=c++11 wx-config --cxxflags
ClipboardDialog.cpp -o ClipboardDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Tabs.cpp -o Tabs.o
g++ -c -g -std=c++11 wx-config --cxxflags
PositionDialog.cpp -o PositionDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Database.cpp -o Database.o
g++ -c -g -std=c++11 wx-config --cxxflags
PgnDialog.cpp -o PgnDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
PgnFiles.cpp -o PgnFiles.o
g++ -c -g -std=c++11 wx-config --cxxflags
GamePrefixDialog.cpp -o GamePrefixDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Session.cpp -o Session.o
g++ -c -g -std=c++11 wx-config --cxxflags
GameDetailsDialog.cpp -o GameDetailsDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
PopupControl.cpp -o PopupControl.o
g++ -c -g -std=c++11 wx-config --cxxflags
WinUciInterface.cpp -o WinUciInterface.o
g++ -c -g -std=c++11 wx-config --cxxflags
GameView.cpp -o GameView.o
g++ -c -g -std=c++11 wx-config --cxxflags
DbPrimitives.cpp -o DbPrimitives.o
g++ -c -g -std=c++11 wx-config --cxxflags
PackedGameBinDb.cpp -o PackedGameBinDb.o
g++ -c -g -std=c++11 wx-config --cxxflags
BookDialog.cpp -o BookDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
CompactGame.cpp -o CompactGame.o
g++ -c -g -std=c++11 wx-config --cxxflags
MoveTree.cpp -o MoveTree.o
g++ -c -g -std=c++11 wx-config --cxxflags
PlayerDialog.cpp -o PlayerDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
PatternDialog.cpp -o PatternDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
TrainingDialog.cpp -o TrainingDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Atom.cpp -o Atom.o
g++ -c -g -std=c++11 wx-config --cxxflags
BinDb.cpp -o BinDb.o
g++ -c -g -std=c++11 wx-config --cxxflags
main.cpp -o main.o
g++ -c -g -std=c++11 wx-config --cxxflags
MonitorUsagePattern.cpp -o MonitorUsagePattern.o
g++ -c -g -std=c++11 wx-config --cxxflags
Undo.cpp -o Undo.o
g++ -c -g -std=c++11 wx-config --cxxflags
GamesDialog.cpp -o GamesDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
GameDocument.cpp -o GameDocument.o
g++ -c -g -std=c++11 wx-config --cxxflags
CompressMoves.cpp -o CompressMoves.o
CompressMoves.cpp: In member function ‘std::__cxx11::string CompressMoves::ToNaturalMoves(const string&, const string&)’:
CompressMoves.cpp:417:13: error: ‘_itoa’ was not declared in this scope
_itoa(nbr++, buf, 10);
^~~~~
Makefile:10: recipe for target 'CompressMoves.o' failed
make[1]: *** [CompressMoves.o] Error 1
make[1]: Leaving directory '/home/frisco/tarrasch-chess-gui/src'
Makefile:6: recipe for target 'srccode' failed
make: *** [srccode] Error 2
Hello,
I tried to compile it in Ubuntu 18.04, Ubuntu 16.04 and the latest Linux Mint version but I get this error:
g++ -c -g -std=c++11
wx-config --cxxflagsCompressMoves.cpp -o CompressMoves.o CompressMoves.cpp: In member function ‘std::__cxx11::string CompressMoves::ToNaturalMoves(const string&, const string&)’: CompressMoves.cpp:417:13: error: ‘_itoa’ was not declared in this scope _itoa(nbr++, buf, 10); ^~~~~ Makefile:10: recipe for target 'CompressMoves.o' failed make[1]: *** [CompressMoves.o] Error 1 make[1]: Leaving directory '/home/peter/sources/tarrasch-chess-gui/src' Makefile:6: recipe for target 'srccode' failed make: *** [srccode] Error 2
Any suggestions?
My main use for a chess GUI is casually analysing games and moves to find out reasoning behind moves or moves-that-weren't-made. Or even run an engine on a current position in a live classic-time game that's happening between top players, for example.
For this, starting and stopping a kibitzer on a position is one of my biggest use cases.
Suggestions:
A) In general, maybe the GUI buttons could be larger. An option for their size would be even better. People with different DPI monitors might want larger or smaller buttons purely for readability / clickability as well
B) Have the kibitzer button have a visible [activated / deactivated] state, i.e pressed or not pressed, etc. To show when the engine is running or not.
C) Perhaps have a button to "Start kibitzer" in the Start area (next to "Setup Position" "Play White", "Play Black", etc)
Lastly, I know many people not familiar with computer chess can tend to have no idea what the term "kibitzer" means, it can be confusing to them. It maybe be more recognisable to replace it with "Engine" or even the name of the engine that will run.
E.g, "Run Stockfish", "Stop Stockfish", etc.
Copy-pasting Unicode chess symbols as a user-defined language in general settings is rejected.
I'm using the no-install version Tarrasch V3.10c on Windows.
For some PGN files, I'm unable to move backward through the game, whether I use the up-arrow key, scroll up on my mouse wheel, or click the Backward (main line) button on the toolbar. Here's a small PGN file that triggers the bug, from Chess.com machine analysis of the newly released AlphaZero games:
test.txt
For this file, if I'm on any of the moves 5...Bxc3, 6. Qxc3, or 6...a5, I'm unable to go backwards. However, if I edit the PGN file and delete one of the sub-variations for these moves, such as (5. e3) on line 15, I'm able to move backwards from 5...Bxc3 to 5. a3, so I suspect something with the two sets of parentheses isn't being handled correctly.
Tarrasch v. 3.12b
Elementary OS 18.04.4 LTS
Linux 5.4.0-42-generic
Changes made in Options -> General don't persist in next session.
No problem redoing them each time, but in at least one case, there are very many.
The position evaluation symbols are laid out:
=
+=
=+
+/-
-/+
+-
-+
I get lost in this layout, because in my head, the symbols are on a number line: -n -+ -/+ =+ = += +/- +- +n, so my mouse instinct scrolls toward the top of the menu for +- but finds =.
I consulted the NAG chart, and I see that you're following that scheme, so I can't use that to support me. But do you agree that if we placed the evaluation symbols over a line representing computer evaluations of a position, it would look like -+ -/+ =+ = += +/- +- .
I've played around seriously with chess computers/programs since the 1980's. One feature I really liked on all those machines was the "fixed think time" for the computer feature. I could easily check my progress as a chess player by starting off letting the machine think for say, 5 seconds. After I had a lot of fun beating it at that level I went to 10 seconds, etc. Eventually on the stronger computers and programs I stalled out at about 3 minutes computer think time. Of course I took all the time I needed. It was a lot of fun. Hardly real world tournament conditions, but a great learning tool. I think your program would benefit greatly if the human, especially beginners, was allowed to set the think time for the machine. Forget about tournament play and just seek the highest think time you can consistently beat the machine is great fun. Sounds like it would not be too difficult to implement that feature in your great little program!
The Engines window says look for an .exe, which doesn't apply to Mac and Linux users. And when the user goes to Browse to connect to an engine, the auto-hint is a Windows path.
Mac and Linux users are used to this, so bottom of the 'to do' list.
I apologize if any of this is out of place. I was bored tonight and decided to run some static analysis on the code. This is an awesome piece of software and thank you very much for your hard work.
It would appear that under certain circumstances GameDocument::GetSummaryXX can return a pointer to temporary memory.
I snipped out the relevant section and annotated it in the following attachment.
GameDocument.txt
PanelBoard also seems to have an issue with the invalidation of c_str returns due to the overload.
void PanelBoard::SetBoardTitle()
{
SetBoardTitle( m_title_saved.c_str() );
}
SetBoardTitle(const char*) then assigns its parameter to a new std::string and then assigns that string to m_title_saved which invalidates the parameter. It then proceeds to reference the invalidated parameter despite it being invalidated by the assignment operator to m_title_saved. I have opened a pull request against this one.
It also appears that it is possible for the const char* values returned by PackedGameBinDb to be used after delete. The c_str() return value is invalidated on the next non const call. While the functions return c_str from the string pool I am not familiar enough with the use of those to know if it is really an issue or not particularly if this data is sent into the gui (which may either copy it or keep it). This one may not be a real huge issue.
friscodelrosario@friscodelrosario-520-1047c:/tarrasch-chess-gui$ sudo make/tarrasch-chess-gui$ lsb_release -a
make -C src
make[1]: Entering directory '/home/friscodelrosario/tarrasch-chess-gui/src'
g++ -c -g -std=c++11 wx-config --cxxflags
LogDialog.cpp -o LogDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
thc.cpp -o thc.o
g++ -c -g -std=c++11 wx-config --cxxflags
ClipboardDialog.cpp -o ClipboardDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Tabs.cpp -o Tabs.o
g++ -c -g -std=c++11 wx-config --cxxflags
PositionDialog.cpp -o PositionDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
PatternDialog.cpp -o PatternDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
PgnDialog.cpp -o PgnDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Database.cpp -o Database.o
g++ -c -g -std=c++11 wx-config --cxxflags
Lang.cpp -o Lang.o
g++ -c -g -std=c++11 wx-config --cxxflags
Eco.cpp -o Eco.o
g++ -c -g -std=c++11 wx-config --cxxflags
GamePrefixDialog.cpp -o GamePrefixDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Session.cpp -o Session.o
g++ -c -g -std=c++11 wx-config --cxxflags
GameDetailsDialog.cpp -o GameDetailsDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
PopupControl.cpp -o PopupControl.o
g++ -c -g -std=c++11 wx-config --cxxflags
WinUciInterface.cpp -o WinUciInterface.o
g++ -c -g -std=c++11 wx-config --cxxflags
GameView.cpp -o GameView.o
g++ -c -g -std=c++11 wx-config --cxxflags
PackedGameBinDb.cpp -o PackedGameBinDb.o
g++ -c -g -std=c++11 wx-config --cxxflags
BookDialog.cpp -o BookDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
CompactGame.cpp -o CompactGame.o
g++ -c -g -std=c++11 wx-config --cxxflags
Book.cpp -o Book.o
g++ -c -g -std=c++11 wx-config --cxxflags
TrainingDialog.cpp -o TrainingDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
Atom.cpp -o Atom.o
g++ -c -g -std=c++11 wx-config --cxxflags
UnixUciInterface.cpp -o UnixUciInterface.o
g++ -c -g -std=c++11 wx-config --cxxflags
BinDb.cpp -o BinDb.o
g++ -c -g -std=c++11 wx-config --cxxflags
CentralWorkSaver.cpp -o CentralWorkSaver.o
g++ -c -g -std=c++11 wx-config --cxxflags
MoveTree.cpp -o MoveTree.o
g++ -c -g -std=c++11 wx-config --cxxflags
MonitorUsagePattern.cpp -o MonitorUsagePattern.o
g++ -c -g -std=c++11 wx-config --cxxflags
main.cpp -o main.o
g++ -c -g -std=c++11 wx-config --cxxflags
GamesDialog.cpp -o GamesDialog.o
g++ -c -g -std=c++11 wx-config --cxxflags
GameDocument.cpp -o GameDocument.o
g++ -c -g -std=c++11 wx-config --cxxflags
CompressMoves.cpp -o CompressMoves.o
CompressMoves.cpp: In member function ‘std::string CompressMoves::ToNaturalMoves(const string&, const string&)’:
CompressMoves.cpp:417:13: error: ‘_itoa’ was not declared in this scope
417 | _itoa(nbr++, buf, 10);
| ^~~~~
make[1]: *** [Makefile:10: CompressMoves.o] Error 1
make[1]: Leaving directory '/home/friscodelrosario/tarrasch-chess-gui/src'
make: *** [Makefile:6: srccode] Error 2
friscodelrosario@friscodelrosario-520-1047c:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal
\src\MemoryPositionSearch.cpp line 1743
if( 8<=src && src<6
should be probably: (src < 16)
I am developing my own engine and communicating with Tarrasch with UCI.
How do I instruct Tarrasch to send a QUIT command to my engine?
Without that, the executable keeps running and I need to kill it manually before I can compile a new one.
For annotators, it's nice to have the ability to insert a null move. Say you want to show the result of a threat if it's carried out.
If you want that note before the actual move played (after White's 26th move, you want to say ahead of Black's move: "White threatens 27. Qxa7!, and then if 27...Rxa7, blah blah blah), you have to mouse in a dummy move (like 26...Kg8-h8 if that doesn't affect the position) before mousing the rest of your variation.
The drawbacks there are that 1) You have to remember to edit the dummy move out of the text before publishing, and 2) you don't like sharing the PGN because how do you explain 26...Kg8?
Some packages give you an "insert null move" option for Black's 26th move. Engine users can then see analysis as though Black passes move 26, and White gets to carry out the deadly threat at move 27.
(This was actually a huge improvement in Deep Blue toward the end of its life. I don't know how they handled that kind of analysis before they implemented null moves. It's how humans ought to think at the board. When the opponent moves, you should ask yourself "what if I did nothing about that, and went ahead with my own schemes?" and the way to calculate that is to imagine yourself passing your move. Similarly, when humans are considering a move that threatens, they have to imagine the opponent making a null move to see if the threat actually gets anywhere.)
Tarrasch v. 3.13b+
Ubuntu v. 20.04.1
(tarrasch:26445): Gtk-CRITICAL **: 17:37:14.621: gtk_box_gadget_distribute: assertion 'size >= 0' failed in GtkSpinButton
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.