Live
Fourteen desktop games in one small window.
Screenshots
About Games Hub
Fourteen games in one window, sized to sit beside whatever you are actually doing. Every game shrinks to about half a 1080p screen, so it fits next to a browser or an editor rather than covering them. It is built for the five minutes between things, not for an evening.
What is in it
Board games against the computer, at three strengths each: Chess — with castling, en passant, promotion and every draw rule properly enforced — Draughts with compulsory captures and multi-jumps, and Reversi.
Card games: Hearts, four-handed against three computer players to 100; and partnership Canasta, two against two, with melds, wild cards, red threes and a freezing discard pile — classic rules plus a house set you can edit.
Patience, four ways: Klondike (draw one or draw three), Spider in one, two or four suits, FreeCell, and Pyramid.
Puzzles and arcade: Minesweeper at three field sizes, generated Sudoku with pencil marks, Snake, 2048, and a pinball table with three balls and two flippers.
The bits that matter in practice
It remembers where you left off. Close the window mid-game and ten of the fourteen come back exactly as they were — Chess brings back the board and the move history, so Undo still works; Canasta brings back the whole table, every hand, the melds, the pile, the stock, the scores and the rules in force. There is no save button. It simply happens. Finish a game and nothing is kept, so you never return to a board you have already won.
The window remembers itself too, separately per game, so one you like large opens large and the menu comes back where you put it. So do your settings — Minesweeper reopens on the difficulty you last played, Canasta on the rules you last used.
Best scores are kept for every game: games won, fastest clears, fewest moves, highest totals.
Minesweeper and Sudoku can be paused, which stops the clock and covers the board, so being interrupted costs you nothing.
There is a Large mode in the toolbar for bigger, higher-contrast play. It is being fitted to the games one at a time — Canasta and Sudoku have it, the other twelve ignore it for now.
Getting it
One file, nothing to install. On Linux it is an AppImage: allow it to run, then
double-click. On Windows, unzip it and run gameshub.exe. Each download carries
its own copy of everything it needs, including the graphics toolkit, so it runs on
a machine that has never had it.
Windows will warn you the first time — "Windows protected your PC" — because the build is not signed. Click More info → Run anyway.
The Linux build needs a reasonably recent system: Ubuntu 24.04, Fedora 40, Debian 13, Tumbleweed or newer. Older ones will refuse to start it, and building from source is the way round that.
Where it stands
In beta and thoroughly playable. Pick a game from the grid; Esc goes back. Each
game puts its own controls on the toolbar beside it, and one switch mutes the lot.
What's new · v1.0.0 8 September 2026
Added
- You can check that a downloaded release is the file this repository built. (GHUB-0054)
Every file published from now on carries a signed record of the
repository, commit and workflow run behind it. Check one with
gh attestation verify <file> --repo milnet01/games-hub; the README says how. Version 0.6.0 and earlier were published before that record existed, so the check fails on those as well. This is the half of the item that needs no key of its own -- the signature and the checksum file ride with the in-app updater instead.
Fixed
Canasta's table holds its shape when the window changes shape (GHUB-0153) The top of a card you had hovered was not clickable, and a strip of felt below it was. Space and Return could play a move while cards were still in the air. On a window taller than it is wide the table lost width as the window grew, which could shrink a card below the size its face is drawn at; the score plates went narrow and their type went large, until a team's name and what it needs to open printed on top of one another. A discard that freezes the pack flew flat to the middle of the pile and then jumped sideways and turned. A finished canasta vanished from its stack while one of its cards was flying to it. And the CANASTA! flourish was sized in a unit that let the screen decide whether the word fitted.
Canasta's rules windows no longer let the hand play on behind them, and the House rules form fits a small screen (GHUB-0154) Opening House rules or Rules in force now stops the computer players until you close it, so a slow read can no longer let the hand finish unwatched. The House rules form scrolls instead of pushing its buttons off the bottom of the screen. Changing the rule set settles the table straight away rather than waiting for the next move, and picking a new target now says the target changed instead of claiming the rule set did. A resumed game's toolbar shows the rule set, target and level it is actually playing.
cardart.h's header comment named three of the card games that use it. (GHUB-0029) It has served six since Canasta, FreeCell and Pyramid arrived, and it is where kFaceMinWidth lives -- so a reader going there to understand that threshold was told the wrong set of callers on the first line. It now names no set at all, which is the part that went stale.
Security
The build now asks the compiler for warnings and for hardening, having asked for neither. (GHUB-0053)
-Wall -Wextraon GCC and/W4on MSVC, for every build. They are fatal only under-DGAMESHUB_WERROR=ON, which CI sets on the Linux leg, so a local build stays workable while the gate stays honest. Turning them on found three real things and no noise: a dead chess helper, and two Wall aggregates leaving a member unwritten. Clang then found six dead constants, one of them a second copy of Pyramid's redeal limit sitting beside the one the rules actually use.Release builds also harden -- stack protector,
_FORTIFY_SOURCE=3, full RELRO, a non-executable stack and a position-independent executable;/GS,/guard:cfand/DYNAMICBASEon Windows. None of it fixes a bug. It decides whether a bug that does exist becomes a crash rather than something worse, in a binary handed to people who cannot inspect it. Verified on the built binary withreadelfrather than assumed from the flags -- PIE in particular needscheck_pie_supported()and silently does not apply without it.

