Skip to content
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

89 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Point Above Fork - Bananagrams for Andrew & Friends

Why This Exists

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/

What We've Done So Far (7 Mar 2026)

Proof of Concept - COMPLETED

  1. Cloned and built the Go backend + Vue.js frontend on Ubuntu server
  2. Installed Go 1.22 at /home/pointabove/go/ (user-local, no sudo)
  3. Generated dictionary from /usr/share/dict/american-english (73,604 words, uppercase)
  4. Patched single-player support - changed minimum player count from 2 to 1 (srv/srv.go line 343)
  5. Configured ports - Backend on :8082/:8083, Frontend dev server on :8084+
  6. Updated vue proxy - vue.config.js proxy target changed to localhost:8082
  7. Fixed OpenSSL error - Node 20 + Webpack 4 requires NODE_OPTIONS=--openssl-legacy-provider
  8. Tested via Tailscale - Pixel 8 Pro accessed at http://100.116.100.7:8085/ (UFW blocks LAN ports, Tailscale bypasses)
  9. Confirmed game works - Backend game logic, multiplayer streaming, word validation all functional

What Needs Doing Next

  • 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.au for access outside Tailscale
  • PWA wrapper - Add to home screen, offline capability

Quick Start (on Point Above server)

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>/

Key Findings

  • 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.

Original README (upstream)

Bananagrama

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.

How It Works

  1. Pick a name
  2. Create or join a game that isn't in-progress or finished.
  3. The game will start when the game creator hits 'Start Game'.

How to Play

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 Esc to 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.

Modifications from traditional Bananagrams

  • 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.

Running locally

Backend

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.

Frontend

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.

In a Docker container

You can use the frontend/serve.sh script to run the frontend, with live reloading.

Not in a Docker container

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.

Future Work

Check Github issues for current limitations and things I might eventually plan on fixing. Contributions are welcome!

About

Web-based Bananagrams

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages