https://github.com/clovisphere/blip
A pirate deduction game where you fire cannonballs at a 4×7 grid to find six hidden sea creatures before you run out of shots.
https://github.com/clovisphere/blip
Last synced: 13 days ago
JSON representation
A pirate deduction game where you fire cannonballs at a 4×7 grid to find six hidden sea creatures before you run out of shots.
- Host: GitHub
- URL: https://github.com/clovisphere/blip
- Owner: clovisphere
- Created: 2026-06-08T09:09:38.000Z (17 days ago)
- Default Branch: dev
- Last Pushed: 2026-06-11T13:09:11.000Z (14 days ago)
- Last Synced: 2026-06-11T13:22:25.330Z (14 days ago)
- Language: JavaScript
- Homepage:
- Size: 78.1 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
[](https://github.com/clovisphere/blip/actions)
[](https://github.com/clovisphere/blip/releases)
[](https://hub.docker.com/r/clovisphere/blip)
[](https://bun.sh)
[](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
**Blip** — a pirate-themed deduction game for ages 9–12. Six hidden sea creatures lurk on a 4×7 grid. Fire cannonballs to find them all before you run out of shots.
## How to play
1. Serve locally (see below) and open `http://localhost:3000`.
2. Pick a level: **n00b**, **ninja**, or **hacker**.
3. Tap any cell to fire a cannonball — a creature pops up on a hit, a ✕ marks a miss.
4. Find all 6 beasts to win. Run out of shots and it's game over.
## Levels
| Level | Shots | Beasts hide… | Hints? |
| ------- | ----- | --------------------- | ------ |
| n00b | 22 | In straight lines | No |
| ninja | 16 | Anywhere (scattered) | Yes — Captain Blip whispers a row or column after each miss |
| hacker | 12 | Anywhere (scattered) | No |
No timer — it's all about the shots.
## Running locally
**With Bun:**
```bash
bun run dev
```
**With Docker:**
```bash
docker build -t blip .
docker run -p 3000:3000 blip
```
Then open `http://localhost:3000`.
> **Note:** The game uses ES modules (`type="module"`), so opening `index.html` directly via `file://` won't work. A local server is required.
## Running tests
```bash
bun test
```
## Project structure
```
blip/
├── index.html
├── server.js # Bun static file server
├── tests/
│ └── game.test.js # unit tests (bun:test)
└── public/
├── css/style.css
└── js/
├── game.js # pure logic — board building, hints, constants
├── main.js # UI — 5-screen state machine, DOM, events
├── matrix.js # Matrix rain canvas (unused, kept for later)
└── sound.js # Web Audio sound effects
```
## Tech
- Vanilla JS (ES modules, no build step, no dependencies)
- Web Audio API for procedural sound effects
- Pure CSS/HTML Captain Blip mascot (pirate face, 3 moods)
- Fonts: [Bangers](https://fonts.google.com/specimen/Bangers) + [Patrick Hand](https://fonts.google.com/specimen/Patrick+Hand) via Google Fonts
## TODO
- [x] Unit tests (game logic — board placement, hints, adjacency)
- [x] Mobile touch support
- [x] Multiple creatures with per-type colours
- [x] Pirate/comic-book redesign with Captain Blip mascot
- [ ] End-to-end tests (Playwright)
- [x] Dockerfile for containerised deployment
- [x] Makefile with `dev`, `test`, `build`, and `docker` targets
- [x] CI workflow (GitHub Actions — build and push image to Docker Hub)
- [x] Custom favicon (Captain Blip)
- [x] Early-loss rule: end the game when shots remaining < beasts remaining (unwinnable state)
- [ ] Per-level theming: distinct background/palette for ninja and hacker to reflect increasing danger
- [x] Center the game layout on all screen sizes (mobile and large desktop)