This does bring up the question though, after capture are the quantum move positions still linked? It seems like they are, and I wasn’t aware when I wrote the rules description.
2 Likes
benjito
December 6, 2024, 10:12pm
203
Yes!
This wasnt obvious to me either from the written rules, but Zi clarified during testing:
We did find a minor issue, i.e., the quantum pairs should live or die together, so once they are removed, the paired positions are still paired, meaning if a new stone is placed on one board in one of the quantum positions, it should also appear in the paired position on the other board.
3 Likes
Oh, good to know! I’ll update the rules description then
3 Likes
This variant is now available under the name Lighthouse! You can find the rules description and demo at https://www.govariants.com/variants/lighthouse/rules
@Jon_Ko and I are currently playing, and I’m streaming my perspective (without commentary) at Twitch
6 Likes
We’ve created a space on Element for the purpose of chatting, arranging games, feedback etc. (partly to make up for the lack of a chat).
Here’s the invitation link: https://matrix.to/#/#govariants:matrix.org (you can also find it on the About page .)
2 Likes
I found my old drafts for another 4-regular periodic pattern, which I’m thinking of adding to our collection. Any name ideas?
Edit (because I replied too often): I’m basically done with the implementation, just looking for a good name now
I searched a bit, but did not find an official name.
4 Likes
I’m not sure higher-dimensional Go works very well - although I’m happy to be proven wrong.
1 Like
Just to clarify, I want confirmation that the server uses area scoring or territory scoring, or whatever.
1 Like
Currently the server uses area scoring, and requires that all dead stones are removed manually (otherwise the automated score is wrong).
3 Likes
martin3141:
automated score is wrong
not wrong, just unexpected for most humans
5 Likes
I think it depends what you mean by higher-dimensional go (and also what “works very well” means). There is definitely something special about the 2D grid, but there are some boards embed in higher dimensions which still use the 2D grid. Examples: toroidal go , Klein bottle
There are also 3D variants that are not based on embeddings of the 2D grid that appear to be playable. Check out the diamond lattice. Diamond Go . Haven’t played it myself so can’t say if it “works”, but at least worthy of exploration.
4 Likes
My guess is that it comes down to the connectivity of the grid, or the liberties of the stones.
At least the lesson from Go on a hexagonal board is that it’s “boring” or not working so well, because groups pick up liberties too quickly and there’s no crosscuts.
If you play on the faces of the hexagons or intersections of the triangular lattices, points have six liberties and groups gain liberties very quickly.
Similarly without crosscuts it’s harder to find tactics to reduce liberties and capture stones, or so I’m led to believe.
I think that’s why you find a lot of Go variants on these grids where the players play two moves in a row like “Every subsequent move, a player places TWO stones.” in trigo or “ Thereafter, the players alternate turns, placing one or two stones of their colour on empty spaces, with the proviso that two stones placed must be of different colours.” with each player using two colours in blooms .
So I think there’s geometric elements and constraints of the grid that can define what makes the game fun, tactical or “working”, which may need to be adjusted for.
5 Likes
Dev Log 6
Highlights
@Gooplet joined the development team and implemented a prototype for Super Tic Tac Go !
@benjito added a default board component, a big step towards unifying the look of the variant boards!
We added a rules sections for variants, linked in the nav bar. Right next to the rules, you can immediately experiment with it in the demo board!
We organised a tournament for playing on a “normal” 19x19 board with random holes: Variant Tournament
Sameer Dalal finished the prototype for ratings (though they are not displayed yet).
Screenshots
Features & Improvements
Variants
lighthouse
main ← fog_of_war
opened 09:03PM - 24 Nov 24 UTC
This is a prototype for a variant where hidden information is the main quirk. Ba… sically what we discussed in the forum but additionally with "last known information".
The board is hidden, but stones cast rays that illuminate fields for their owner only. Any field that is not illuminated displays its last known information.
I'm trying to build it such that the observer view does not reveal any information to players. I'm not sure how to handle Ko and Self-Capture yet, since players could gain information when they receive an Error and can play another move.

I've added the possibility to change the background colour of specific fields to MulticolorGridBoard, and a new board component that uses it. I'm not sure if this is good tbh, but I wanted it to test the game class.
Also not sure if fog of war is a good name.
Super Tic Tac Go
main ← superTicTacGo-variant-test
opened 09:12PM - 02 Apr 25 UTC
Added a new variant `SuperTicTacGo`, as well as a rules description. Included cl… ass `Nonant` to manage the 9 subsections of the goban.
Class SuperTicTacGo extends Baduk, and overrides `playMove()`, `postValidateMove()`, and `prepareForNextMove`.
main ← superTicTacGo-variant-test
opened 08:50PM - 09 Apr 25 UTC
sttg now overrides `Baduk.playMoveInternal()` to handle self-capture moves.
… Removed tests for private methods, as well as the sttg method written specifically for testing.
board patterns
sunflower
main ← new_4_regular_board_pattern
opened 12:45PM - 17 Mar 25 UTC
~~Temporarily named "Flower", but I'm not happy with this name, so draft for now… .~~
Named "Sunflower" for no particular reason (I didn't find an official name for this tessellation).
Size 3:

custom graph
main ← custom-graphh
opened 04:59AM - 12 Apr 25 UTC
Fixes #111
Need to do some more testing, but basically this one allows arbit… rary adjacency lists
I guess the biggest thing that we need to get right at the beginning is the input format. Does this seem reasonable?
```
{
"coordinates": [[0, 0], [0, 1], [1, 0], [1, 1]],
"adjacencyList": [[1, 2], [0, 3], [0, 3], [1, 2]]
}
```
## Screenshots
<img width="424" alt="Screenshot 2025-04-12 at 2 38 13 PM" src="https://github.com/user-attachments/assets/f578723a-380f-4819-a585-af456fbff7da" />
<img width="551" alt="Screenshot 2025-04-12 at 2 36 42 PM" src="https://github.com/user-attachments/assets/840810c7-70ca-49d3-bf13-1d3ea0c30ac0" />
<img width="697" alt="Screenshot 2025-04-12 at 2 37 31 PM" src="https://github.com/user-attachments/assets/d21ab320-a3b5-48b7-8865-5a90e536e7b5" />
ratings
main ← update-db-values
opened 08:13PM - 02 Nov 24 UTC
I created functionality to update user ratings as well as a simple function that… is available if a username needs to be changed.
For now, the rating type is a number, but later it will be the type indicated by Glicko2. I wanted to add the Glicko2 library to the project in another commit for clarity.
main ← rating-system
opened 08:44PM - 15 Nov 24 UTC
Created the first version of the rating system.
Currently, the user ratings a… re updated after every match, which is not ideal according to the glicko2 library. Instead, after a match, I want to add the result to the `matches` array and then store the array somewhere in the database. Then when the `matches` array has 10 elements, we can update the ratings and clear the array. So my question is where in the database should I store the `matches` array?
rule descriptions & demo
main ← quantum_rules
opened 09:36PM - 05 Nov 24 UTC
This adds a rules description for quantum.
I've also noticed a (imo weird) cs… s selector that changes the layout and font-weight of the rules description. I suspect this may be from the standard stylesheet, that we started out with. I think it's weird because it selects all elements in the dom, basically.
main ← sfractional_rules
opened 09:16PM - 10 Nov 24 UTC
main ← preselect_seat_in_demo
opened 10:12PM - 21 Nov 24 UTC
main ← add_demo_board_to_rules_page
opened 09:05PM - 22 Nov 24 UTC
This adds a new view that is linked to in the NavBar and has links to the rules … page for variants with a (detailed) rules description.
Also I've added the demo board to the rules view as proposed in https://github.com/govariantsteam/govariants/issues/112
I wasn't able to make sure that the demo board fits, so I made its container scrollable on overflow.
### Rules List



### Rules Page


main ← tetris_rules_description
opened 08:16PM - 05 Dec 24 UTC
main ← lighthouse_rules
opened 11:24AM - 22 Dec 24 UTC
default board
main ← flex-board
opened 04:10AM - 09 Nov 24 UTC
Based on discussion on #137, this is a proposal to replace Board .vue files with… a simple JS function. It's a larger PR, so to summarize:
- Introduce `DefaultBoard` (a selector for MulticolorGridBoard and MulticolorGraphBoard)
- Introduce `uiTransform` (a function that can update the config and state to fit the DefaultBoard interface)
- To validate, migrate `FreezeGo` to the `DefaultBoard` and test.
Testing: Freeze go and other variants seem to show up fine in the game list, game view, and demo view.
For example, here is the demo view:

main ← migrate-baduk
opened 12:17AM - 13 Nov 24 UTC
The main change is the addition of `uiTransform` to `baduk.ts` and deletion of t… he three boards in vue-client/src/components/boards, but there are a bunch of knock-on effects because so many variants are built on top of this variant.
I'll try to comment on seemingly unrelated changes in this diff.
**Tested:** I spot checked affected variants


main ← quantum-migration
opened 11:33PM - 14 Nov 24 UTC
https://github.com/govariantsteam/govariants/pull/327#discussion_r1842799084
… The major benefit is that we're able to remove some duplicate codepaths for Grid and Graph boards. I did fudge types quite a bit, so I'm open to ideas on improvement, but overall, it works, and I think the reduction in code (~50 lines) is worth it.
Tested: both grid and graph boards

Forgot to screnshot grid, but I promise I tested that too :)
main ← nit-grid-config
opened 11:50PM - 14 Nov 24 UTC
https://github.com/govariantsteam/govariants/pull/327#discussion_r1842805153
main ← migrate_sfractional_board
opened 04:05PM - 15 Nov 24 UTC
This makes it so SFractional also uses the DefaultBoard component. Regarding the… playing table, it works to have the uiTransform return an extended type (thanks for the suggestion @benjaminpjones !), and I think I found a relatively nice way to indicate the types.
relates to https://github.com/govariantsteam/govariants/issues/137
main ← last_move_indicator_in_ui_transform
opened 05:37PM - 06 Jan 25 UTC
Issue: #137
- circle annotation uses mix-blend-mode: difference
- enable the … annotation in variants baduk, sfractional
- fix annotation in graph board


admin role
main ← admin2
opened 11:12PM - 24 Nov 24 UTC
This adds the admin role and one elevated privilege: the ability to make another… user an admin.
[Screencast_20241123_232459.webm](https://github.com/user-attachments/assets/ad96e336-901f-4a88-9231-f76dc22e4e03)
A couple required, but not directly related changes:
- Created User page, where we add the "Make Admin" button
- Fixed up some User types:
- `id` should be required in `UserResponse`, except for DB code
- Some instances of `User`changed to `UserResponse`.
- I think these are generally interchangeable (except for the optional id issue). I should follow up to merge the two.
main ← kick-user
opened 11:28PM - 31 Dec 24 UTC
This adds a little toggle on the games page for admins that allows them to use s… pecial powers. It's off-by-default, so admins can enjoy games as normal users. This PR also adds the power to kick a user from their seat.

https://github.com/user-attachments/assets/2c7cd98b-c80e-487d-af68-ea66066309f1
main ← delete-users
opened 01:22AM - 01 Jan 25 UTC
Basically what the title says. Additionally, I pulled in the [sweetalert2](http… s://sweetalert2.github.io) library. This gives us ability to launch more advanced modals than `window.alert()`, which was necessary for the additional verification in the User deletion flow.
0) Log in as admin
1) Click "Delete User"
2) Enter user's name as a safeguard

3a) On failure, inform the admin

3b) On success, inform the admin, then return home

board preview
main ← board_preview
opened 06:03PM - 19 Mar 25 UTC
issue: #187
Adds a board preview component, alongside a component "expandabl… e pocket" which can be used to expand / collapse arbitrary content.

show who hasn’t played yet in parallel variants
main ← next-to-play-2
opened 03:05AM - 30 Mar 25 UTC
Currently, we list every player in `nextToPlay` because, technically, all player… s may move. I propose we exclude staged players since they are not required to play again in the round. Motivation: I believe this will be useful in [Forums game](https://www.govariants.com/game/670952d842e74078c7a967fe) where players have often not realized they were holding up the round.
If this change is agreeable, I'm happy to follow up and update all the parallel variants.
## Testing
Manually, I tried a fractional game, and observed:
a) players are still able to edit their moves for the duration of the round
b) only unstaged players are listed in the "Players to move" component
https://github.com/user-attachments/assets/c5eb156f-8eae-4c35-881d-76a4e18fa5c9
main ← parallel-next-to-move
opened 06:08PM - 30 Mar 25 UTC
- `Indexes` -> `Indices`, move `getNullIndices()` into utils
- Tbh I though… t we had more than 2 parallel variants, hence the move to utils.
- `parallel` to take the same `nextToMove` approach as `fractional` (see #381)
Tested:
- unit tests caught a lot!
- manually checked the parallel variant
CSRF-protection
main ← csfr_protection
opened 01:52PM - 03 Apr 25 UTC
issue: #346
Based on [https://medium.com/@brakdemir/csrf-prevention-on-node-… js-express-without-csurf-da5d9e6272ad](url) using the Synchronizer Token Pattern
This is my attempt to add a system that protects us again Cross Site Request Forgery.
With CheckLogin, a random token is generated, stored in the users session, and sent in the response body. The client then sends this token in all requests header, and the server compares it to what was stored in session.
Graph boards in variant pyramid
main ← generalised_pyramid_counting
opened 02:50PM - 27 Apr 25 UTC
# Proposed Changes
- Add graph utils including a function to calculate generali… sed pyramid weights
- Refactor variant Pyramid s.t. it supports graph boards (grid board uses the classical weights schema)
- Weights are calculated once on client and stored in config
- Fix a bug of voronoi diagram
# Note
- I noticed that the voronoi calculations sometimes crash, e.g. with sunflower board. I'll try to fix that.

Maintainance & Documentation
cleanup deprecated variant BadukWithAbstractBoard
main ← old_stuff_cleanup
opened 10:16AM - 04 Nov 24 UTC
Sorry for the big diff. This is a bunch of cleanup of old stuff.
- Delete dea… d code: BadukBoardAbstract (was used before we had the board factory), IBadukBoard, StoneState, BadukWithAbstractBoardConfigForm
- Move board creation helpers into lib/abstractBoard/helper
- Move BadukWithAbstractBoard into variants/deprecated
- Export / Import fixes
main ← sanitize_baduk_with_abstract_board_config
opened 07:09PM - 05 Nov 24 UTC
Follow-up for https://github.com/govariantsteam/govariants/pull/318
More cle… an-up of the deprecated variant, tested locally
lint rules
main ← lint-imports
opened 12:01PM - 09 Nov 24 UTC
Now linter can catch the `@ogfcommunity/variants-shared/src/path/to/file` import… s!
main ← eqeqeq
opened 04:14AM - 02 Apr 25 UTC
This feels like best practice (I had actually assumed this rule was already pull… ed in via `recommended`)
commit hooks
main ← husky
opened 02:18AM - 27 Nov 24 UTC
Fixes #290
Git hooks is something I find personally useful, and I notice a l… ot of "fix lints" commits so I wonder if it would help others too. If you think this would be a bother, let me know and we can make it opt-in (likely by removing it from the "postinstall" script.)
A couple things to know about using husky:
- If we call it in "postinstall" it will be propagated to all developers during `yarn` install
- Devs can add `-n`/`--no-verify` flag during `git commit` to skip the check
main ← lint-staged
opened 07:22PM - 14 Dec 24 UTC
## Problem Statement
pre-commit check currently:
- is slow (>30s on my mac… hine)
- checks all changes, even if they aren't staged
- performs write operations
## Proposed Changes
- Use [lint-staged](https://github.com/lint-staged/lint-staged?tab=readme-ov-file#configuration)
- Just lint, skip tests
- Run read-only operations (e.g. `--check` instead of `--write`)
## Benchmarks
On my machine (Intel Core i5-8250U CPU @ 1.60GHz), I have these times after staging changes for a single file:
- `yarn lint`: ~14s
- `yarn test`: ~20s
- `yarn lint-staged`: ~6s
Therefore, we have a roughly 5x speedup, though it will depend heavily on the machine and staged files.
update dependencies
main ← upgrade-ws
opened 03:45PM - 30 Nov 24 UTC
ws is a transitive dependency via socket.io and jsdom. There is a security vulne… rability (CVE-2024-37890, https://github.com/advisories/GHSA-3h5v-q93c-6h6q) affecting <8.17.1 causing DoS when handling a request with many HTTP headers.
I was able to remove our dependence on jsdom. The vulnerability was handled in socket.io so I upgraded that as well.
## Changes
- Upgrade socket.io in both server/ and vue-client/ (4.7.1 -> 4.8.1)
- Added yarn plugin `upgrade-interactive`
- not strictly required for this PR, but it helps with version upgrades
- Removed jsdom and associated scripts
- needed to keep @types/jsdom to prevent TS from complaining about browser APIs, but I moved it to the right package (server -> vue-client)
## Tested
Deploy scripts still work:
```
yarn build
NODE_ENV=production yarn workspace @ogfcommunity/variants-server launch
```
And we can verify that ws is upgraded using `yarn why` (note all ws are at 8.17.1):
```
├─ @ogfcommunity/variants-server@workspace:packages/server
│ └─ socket.io@npm:4.8.1 (via npm:^4.8.1)
│ ├─ engine.io@npm:6.6.2 (via npm:~6.6.0)
│ │ └─ ws@npm:8.17.1 [5e1ad] (via npm:~8.17.1 [5e1ad])
│ └─ socket.io-adapter@npm:2.5.5 (via npm:~2.5.2)
│ └─ ws@npm:8.17.1 [5e1ad] (via npm:~8.17.1 [5e1ad])
│
└─ @ogfcommunity/variants-vue-client@workspace:packages/vue-client
└─ socket.io-client@npm:4.8.1 (via npm:^4.8.1)
└─ engine.io-client@npm:6.6.2 (via npm:~6.6.1)
└─ ws@npm:8.17.1 [5e1ad] (via npm:~8.17.1 [5e1ad])
```
main ← upgrade-express
opened 04:36PM - 30 Nov 24 UTC
It seems there are some patched vulnerabilities between 4.18 and 4.21, including… https://github.com/expressjs/body-parser/security/advisories/GHSA-qwcr-r2fm-qrc7. Let's upgrade.
Tested: yarn build & NODE_ENV=production yarn workspace @ogfcommunity/server launch
document variant interface
main ← document-variant
opened 05:25PM - 12 Apr 25 UTC
Fixes #388
This is one of the core classes used by variant implementers, but… it's not always clear how these methods get used by the website. Hopefully these docs clarify both intention and usage.
Bugfixes
main ← fractional-index-capture-bug
opened 03:53AM - 24 Nov 24 UTC
Wrong intersection indices were compared. E.g. the surrounded corner stone in th… e test was not checked, because it was `changedIntersection[7]` and `AbstractBaduk`'s `this.intersection[7]` was already checked as a part of the long black chain.
This fixes the [bug mentioned on OGS forums](https://forums.online-go.com/t/parallel-fractional-go-game-4/53434/100) of Game 4's round 16.
main ← issue-333
opened 09:06PM - 25 Nov 24 UTC
main ← fix_sierpinsky_board
opened 10:50PM - 02 Jan 25 UTC
I am happy to see that somebody played on the Sierpinsky board 😄
I noticed tha… t the stones overlap:

This PR fixes it:

main ← move_race_condition
opened 11:16AM - 04 May 25 UTC
This is a proposal for solving the race condition bug in #226
We introduce a n… ew field for game documents `lastMoveTime`, and rewrite the db update call s.t. it fails if this field changed in the meantime.
This has the following advantages:
- No usage of transaction (this would add some starting hurdle for devs, because they would need to make sure their local db instance is a replica set. Also makes the code more verbose, and as @benjaminpjones wrote, fundamentally transactions solve a different problem - atomicity for a set of db updates)
- In the scenario of two (almost) simultaneous calls to `playMove`, exactly one request throws an error.
Also adds a schema for games, because it was somehow necessary for this update call (plus makes things easier).
# Steps to test
add the following lines in `GameView` line 168
```
const test = {
first: requests.post(`/games/${props.gameId}/move`, move).catch(alert),
second: requests.post(`/games/${props.gameId}/move`, move).catch(alert),
};
```
9 Likes
Tschej
September 30, 2025, 5:04am
216
Hi,
thanks for the nice documentation
In order to try creating a blind Go mode I copied the repo, installed yarn, copied a existing variant, set it up as new one to test if it works and was able to successfully run this local game variant on the localhost server.
My question as a beginner 25kyu dev is now: Do I have to be careful about anything, testing my local variant?
Thanks ^^
4 Likes
Jon_Ko
September 30, 2025, 5:32am
217
What are you worried about? Changes you make will only affect your local setup until you request us to pull them into our code that’s running govariants.com .
If you tell the code to delete all your data from your machine, there’s a good chance it might really do it, once you run it. So don’t do stuff like that.
4 Likes
Tschej
September 30, 2025, 5:38am
218
What are you worried about?
No idea Its just new stuff to me. Thanks for your answer!
4 Likes
Hey that’s awesome!
As Jon_Ko said, no need to be cautious! Any persistent changes will be made to your local MongoDB instance (provided you’ve installed one - which is not necessarily required to develope a new variant).
If you have any question(s) about the project, please don’t hesitate to ask!
4 Likes
I’m excited to tell you that we’ve recently added Rengo in a way that it works in combination with any of the currently available variants! Kindof like a variant modifier .
Our implementation uses the subvariant as a blackbox, and replaces each of its player slots by a team of multiple players. The team members alternate playing moves for the corresponding player slot in the subvariant in cyclic order.
For example you could play Rengo-Chess, which I guess means that we’re now also a chess variant site
What I find exciting about it, is that (in theory) you can really use any subvariant, whether it has alternative sequential move order like Thue-Morse Go or parallel moves like Fractional Go . Even rengo is a possible subvariant to itself (though all that does is make the teams bigger). Internally we’ve called the concept “higher order variant”.
Full disclosure: I have not tested all possible subvariants, so hopefully nothing breaks!
Here’s a breakdown of the config form for creating a rengo game:
You can freely experiment with it in the demo view .
Here are some further ideas for adding “higher order variants” in future: Pie Rule , Miai Go , Democratic Go
6 Likes
Check out our new notifications system ! Its primary purpose is to make it easier to play correspondence games, but you can also use it to stalk get notified about other peoples games.
The game page features a blue bell icon in the top-right. Clicking it opens an overlay where you can configure your subscription to this game.
There are four categories:
Game end - Receive a notification when the game concludes.
New round - Receive a notification when a new round starts.
My move - Receive a notification when a new round starts where you can play a move.
Seat change - Receive a notification when any user takes or leaves a seat.
The red badge in the nav bar displays your number of unread notifications. This item links to the notifications page, which displays your notifications grouped by game.
Here you can mark the notifications as read (the checkmark), delete notifications (the garbage bin), and change your subscription options (the gear). Clicking on a board takes you to this game’s page.
Currently there are only on-site notifications, but adding email notification options may follow in future, as @benjito has already implemented sending emails !
We auto-delete old notifications when they are (effectively) made irrelevant by new ones. For example “Round 9 has started.” is deleted when round 10 starts.
Now who wants to try it and play some correspondence variant games with me?
3 Likes