Andrew (Point Above Consulting) wanted a Bananagrams app to play on his Pixel 8 Pro with friends. No official Bananagrams app exists on Android. After researching alternatives (Plantaingrams web app, Take Two on Play Store), we found this open-source repo by bcspragu (MIT licensed) which had a fully working game engine. Instead of building from scratch, we forked it as a foundation.
Upstream: https://github.com/bcspragu/Bananagrama
Forked by: Tash Build (Claude Code) for Andrew McDowell, 7 Mar 2026
Location on server: /home/pointabove/2GITHUB/Bananagrama/
- Cloned and built the Go backend + Vue.js frontend on Ubuntu server
- Installed Go 1.22 at
/home/pointabove/go/(user-local, no sudo) - Generated dictionary from
/usr/share/dict/american-english(73,604 words, uppercase) - Patched single-player support - changed minimum player count from 2 to 1 (
srv/srv.goline 343) - Configured ports - Backend on :8082/:8083, Frontend dev server on :8084+
- Updated vue proxy -
vue.config.jsproxy target changed tolocalhost:8082 - Fixed OpenSSL error - Node 20 + Webpack 4 requires
NODE_OPTIONS=--openssl-legacy-provider - Tested via Tailscale - Pixel 8 Pro accessed at
http://100.116.100.7:8085/(UFW blocks LAN ports, Tailscale bypasses) - Confirmed game works - Backend game logic, multiplayer streaming, word validation all functional
- Mobile-first frontend rewrite - Current UI is keyboard-only (type word + Enter). Needs touch: tap tile from hand, tap grid position to place. This is the main blocker for mobile play.
- Online presence - "I'm online" status, push notifications to friends when someone starts a game
- Friends list - Small group invite system (could be as simple as shared room links)
- Persistent storage - Currently in-memory DB (wiped on restart). Add PostgreSQL or SQLite.
- Cloudflare tunnel route -
bananagrams.pointabove.com.aufor access outside Tailscale - PWA wrapper - Add to home screen, offline capability
cd /home/pointabove/2GITHUB/Bananagrama
# Backend
export PATH="/home/pointabove/go/bin:$PATH" GOPATH=/home/pointabove/gopath
./bananagrama --dict=dict.txt --addr=:8082 --api_addr=:8083 &
# Frontend
cd frontend && NODE_OPTIONS=--openssl-legacy-provider npx vue-cli-service serve --port 8084 &
# Access via Tailscale on Pixel
# http://100.116.100.7:<frontend-port>/- Backend (Go + gRPC-web): Solid. Game rules, tile distribution, word validation, multiplayer streaming all work correctly.
- Frontend (Vue 2 + TypeScript): Functional but desktop-only. Uses keyboard events for tile placement. Not usable on mobile without rewrite.
- Auth: JWT-based, auto-generates ECDSA key on first run. Cookies store player-id/token. Cookies are domain-specific (clearing required after backend restart since DB is in-memory).
- Architecture: gRPC server on one port, gRPC-web HTTP wrapper on another. Frontend dev server proxies API calls.
This is a web-based implementation of Bananagrams. This repo used to hold a very different codebase which was for Bananagrams between RPC-slinging AIs, but the codebase has been repurposed to build a web version of Bananagrams. The purpose is mainly to facilitate my yearly Christmas gift to my friends: a drunken web-game-based tournament for cash, prizes, fame, and glory.
- Pick a name
- Create or join a game that isn't in-progress or finished.
- The game will start when the game creator hits 'Start Game'.
It's basically normal Bananagrams:
- The tiles at the bottom are the tiles in your hand.
- Place words by typing them out and hitting
Enter. - The game will suggest places to play your words, use the left and right
arrows to cycle though suggestions, and
Escto cancel. - Click a tile on the board to place it back in your hand.
- Double-click a tile in your hand to dump it back to the bunch (in exchange for three new tiles from the bunch).
- To place a word manually, click the tile in your hand, and click the empty space on the board where it should be placed.
- When a player PEELS (i.e. arranges all the tiles in their hand into a valid board), all players will receive a new tile from the bunch. This is represented by a red flash for the non-PEELing players.
- Like in real Bananagrams, you can put invalid words on your board. Unlike in real Bananagrams, you can't PEEL with an invalid board. This means there's no validation at the end of the game where other players can scrutinize your board.
- If there are more than 8 players, the number of tiles in the bunch increases. For every 8 players beyond the initial 8, another 144 tiles will be added to the bunch at the start of the game, following the same distribution as the initial 144.
- [Planned, but not implemented] Instead of just having a winner and losers, there will actually be a ranking of players. The winner will be whoever issued the last peel. Remaining players will be ordered by how many times they peeled, with ties broken by how many letters they had on their board. There are certainly problems with this approach, but I have no plans to fix them in the short term.
The backend is written in Go and the main binary lives in cmd/server. From
the root of the project, run:
cd cmd/server && go run main.go --dict=dict.txt
--dict should specify the path to the dictionary to get the valid word list
from. The dictionary should be formatted as a single, upper-cased word per
line.
NOTE: Since we're just using go run, there's currently no support for
live-reloading of the backend, which would currently be annoying anyway
because the DB runs in-memory.
The frontend is written in TypeScript/Vue.js. I don't like polluting my local computer with JS development tools, so I run the frontend in a Docker container.
You can use the frontend/serve.sh script to run the frontend, with live
reloading.
If you have a local JS environment containing Yarn and all that jazz, you should be able to run:
$ cd frontend
$ yarn # to install node_modules
$ yarn serve # to run server
But I've never tested this personally.
Check Github issues for current limitations and things I might eventually plan on fixing. Contributions are welcome!