Shoalmates · Customization Guide · version 1.0.0 · Main buyer guide

Customization Guide

Make Shoalmates your own game: new creatures, new backgrounds, your own logo, texts, music and sounds, and easier or harder levels. Every recipe below is a short list of steps and says exactly which file to open. You do not need to know how to program. All pictures on this page are real screenshots of the game in this package.

1. Before you start

Free tools you need:

Which folder to edit. The download has two copies of the game:

The paths in this guide (for example assets/art/logo.webp) are the same inside both folders.

Make a backup first. Copy the whole folder (or keep the ZIP you downloaded) before changing anything. If something breaks, you can always go back.

See your changes on your computer. The game must be opened from a web address, not by double-clicking index.html. Two easy ways:

python -m http.server 8080

After each change, reload the page with Ctrl+F5 (Windows) or Cmd+Shift+R (Mac) so the browser does not show the old file.

On your own computer (addresses that start with localhost) you can jump to any level by adding ?level=12 to the address, for example http://localhost:8080/?level=12. This shortcut does not work on a published site.

2. Where everything is

The numbers on each screenshot match the table below it. Texts are named by their key in src/locales.js (recipe E).

Title screen

Title screen, real screenshot with numbered parts 1 2 3 4 5
# What you see File to change
1 Logo assets/art/logo.webp. The same file is used on the title screen and at the top of the home screen (recipe B).
2 Subtitle ribbon Text: key tagline in src/locales.js (recipe E). Ribbon picture: assets/art/ribbon-coral*.webp.
3 Creatures of the title The creature pictures in assets/art/: clown.webp, puffer.webp, angel.webp and the others (recipe C).
4 Tap to start button Text: key tapToStart. Glass shape: assets/art/glass-pill.webp.
5 Background assets/art/bg-home.webp for the title and the home screen (recipe D).

Home screen (My Reef)

Home screen (My Reef), real screenshot with numbered parts 1 2 3 4 5 6 7
# What you see File to change
1 Pearl counter Pearl icon: assets/art/pearl.webp. Brown plate: ui-plate*.webp. Starting pearls and helper prices: recipe G.
2 Small logo assets/art/logo.webp, the same file as the title screen.
3 Settings button Icon: assets/art/ic-gear.webp. Round button: ui-round-blue.webp.
4 Rescued creatures The same creature pictures used in the levels (recipe C). They appear here as the player fills the album.
5 Reef decoration Pictures: assets/art/decor-*.webp; stone base: pedestal.webp. Which level opens each spot and its three choices: PEDESTALS in src/config.js (recipe I).
6 Play button Text: keys play and levelN. Button picture: assets/art/ui-btn-coral*.webp.
7 Album, Journey and Daily Texts: keys album, journey, daily. Icons: ic-book.webp, ic-map.webp, ic-calendar.webp.

Journey map

Journey map, real screenshot with numbered parts 1 2 3 4 5 6
# What you see File to change
1 Back button Icon: assets/art/ic-back.webp.
2 World name Texts: keys w_coral, w_kelp, w_ship, w_glow, w_ice, w_deep. Ribbon: ui-ribbon-gold*.webp.
3 Stars earned Icon: assets/art/ui-star.webp. Three stars per level, 60 levels.
4 Current level Round button: assets/art/ui-round-red.webp; mascot above it: puffer-front.webp; sparkles: sparkle.webp.
5 Locked level Glass ball: assets/art/glass-orb.webp; lock: padlock.webp.
6 World background assets/art/bg-coral.webp, bg-kelp.webp, bg-ship.webp, bg-glow.webp, bg-ice.webp, bg-deep.webp: one per world (recipe D).

A level

A level, real screenshot with numbered parts 1 2 3 4 5 6 7 8
# What you see File to change
1 Level number Text: key level. Plate: assets/art/ui-plate-bl.webp and ui-plate-br.webp.
2 Pearl counter Pearl icon: assets/art/pearl.webp. Brown plate: ui-plate*.webp. Starting pearls and helper prices: recipe G.
3 Pause button Icon: assets/art/ic-gear.webp. It opens the pause window with the volumes.
4 Top bubbles Drawn by src/render/view.js with assets/art/glass-orb.webp. How many are open at once: floats in recipe F.
5 Bubbles with creatures Creatures: the pictures of recipe C. Extra pieces: kelp.webp, clam-lock.webp, key.webp, oyster.webp, gold*.webp. How many creatures and kinds: recipe F.
6 Tray Drawn by src/render/view.js. Number of spots: TRAY in src/sim/sim.js (recipe F).
7 The three helpers Pictures: assets/art/pelican.webp, crab-broom.webp, whirl.webp. Names: keys scoop, sweep, whirl. Prices: recipe G.
8 World background assets/art/bg-coral.webp, bg-kelp.webp, bg-ship.webp, bg-glow.webp, bg-ice.webp, bg-deep.webp: one per world (recipe D).

Windows (pause, settings, win, lose) share the same pieces: the glass window is assets/art/glass-panel.webp, the title ribbons are ribbon-coral*.webp, ribbon-gold*.webp and ribbon-purple*.webp, the buttons are ui-btn-coral*.webp (red) and ui-btn-teal*.webp (green-blue).

Pause window, real screenshot
Pause: the three volumes, vibration, reduced motion and the language. Icons: ic-music, ic-speaker, ic-mic, ic-phone, ic-motion, ui-globe; switches: ui-toggle-on and ui-toggle-off.
Settings window, real screenshot
Settings, opened from the home screen. The mascot on top is puffer-peek.webp.
Level complete window, real screenshot
Level complete: stars ui-star.webp and ui-star-off.webp, light rays sunburst.webp and rays.webp, mascots splash*.webp.
Level lost window, real screenshot
Level lost: the sad mascot is puffer-sad.webp. Texts: keys soClose, onlyLeft, tryAgain, secondChance, addsSlot.
Album screen, real screenshot
Album: one glass ball per creature (glass-orb.webp); creatures not met yet show ic-question.webp.
A level on a phone held upright, real screenshot
A phone held upright: the same pictures, sized to the screen.

4. Recipe A: replace a picture

All pictures are in assets/art/ in WebP format. The game finds each picture by its file name, so a new picture with the same name simply takes its place.

  1. Find the file with the screens above or by its name: creature names (clown, puffer...), bg-* backgrounds, decor-* reef decorations, ui-btn-* buttons, ribbon-* and ui-ribbon-* ribbons, ui-plate* brown plates, glass-* glass pieces, ic-* icons.
  2. Open the old picture in your image editor and note its width and height.
  3. Make your new picture with the same width and height and a transparent background (except the bg-* backgrounds). Keep the drawing in the same position inside the picture.
  4. Export as WebP with the exact same name, for example pearl.webp, and replace the old file.
  5. Buttons, ribbons and plates come in four files: the whole piece and three slices that let it stretch, for example ui-btn-coral.webp, ui-btn-coral-l.webp (left end), ui-btn-coral-m.webp (middle) and ui-btn-coral-r.webp (right end). Replace all four, cutting your new picture at the same places.
  6. Reload the game with Ctrl+F5.
Tip: if your new picture looks too big, too small or cut, its size is different from the old one. Make it exactly the same width and height.
  1. Logo: replace assets/art/logo.webp (recipe A). Keep the same width, height and transparent background.
  2. Browser tab name: open index.html and change the text between <title> and </title>. On the line of the logo, a little below, change the name inside alt="SHOALMATES" too (screen readers read it).
  3. Subtitle under the logo ("Bubble Fish Sort"): key tagline in src/locales.js (recipe E).
  4. Tab icon: replace favicon.ico, next to index.html.

6. Recipe C: change the creatures

There are 12 creatures and the Golden Fish. Each one is a set of five pictures in assets/art/: the picture alone and four faces (-x0 normal, -blink eyes closed, -happy, -worry). Replace the whole set, drawing the same creature with the four faces, in the same size and position.

# Name in the game Pictures Spoken name
0 Clowny clown.webp, clown-x0.webp, clown-blink.webp, clown-happy.webp, clown-worry.webp name_0.mp3
1 Rolly Puffer puffer.webp, puffer-x0.webp, puffer-blink.webp, puffer-happy.webp, puffer-worry.webp name_1.mp3
2 Sunfin angel.webp, angel-x0.webp, angel-blink.webp, angel-happy.webp, angel-worry.webp name_2.mp3
3 Wiggle eel.webp, eel-x0.webp, eel-blink.webp, eel-happy.webp, eel-worry.webp name_3.mp3
4 Curly seahorse.webp, seahorse-x0.webp, seahorse-blink.webp, seahorse-happy.webp, seahorse-worry.webp name_4.mp3
5 Starla star.webp, star-x0.webp, star-blink.webp, star-happy.webp, star-worry.webp name_5.mp3
6 Pinchy crab.webp, crab-x0.webp, crab-blink.webp, crab-happy.webp, crab-worry.webp name_6.mp3
7 Bluey tang.webp, tang-x0.webp, tang-blink.webp, tang-happy.webp, tang-worry.webp name_7.mp3
8 Boxy box.webp, box-x0.webp, box-blink.webp, box-happy.webp, box-worry.webp name_8.mp3
9 Stripes banner.webp, banner-x0.webp, banner-blink.webp, banner-happy.webp, banner-worry.webp name_9.mp3
10 Jelly jelly.webp, jelly-x0.webp, jelly-blink.webp, jelly-happy.webp, jelly-worry.webp name_10.mp3
11 Inky octo.webp, octo-x0.webp, octo-blink.webp, octo-happy.webp, octo-worry.webp name_11.mp3

7. Recipe D: change the backgrounds and the worlds

  1. Backgrounds are in assets/art/: bg-home.webp (title and home) and one per world, in this order: bg-coral.webp (levels 1 to 10), bg-kelp.webp (11 to 20), bg-ship.webp (21 to 30), bg-glow.webp (31 to 40), bg-ice.webp (41 to 50), bg-deep.webp (51 to 60).
  2. Replace a file with a picture of the same width and height (recipe A). Keep the middle calm, without strong details: the bubbles are drawn there. The sides are shown blurred on wide screens.
  3. World names: keys w_coral, w_kelp, w_ship, w_glow, w_ice, w_deep in src/locales.js (recipe E). The file names stay the same even if your world has another theme; players never see them.

8. Recipe E: change texts and translations

All texts players read are in two files: src/locales.js (English, Portuguese, Spanish) and src/locales-more.js (French, German, Italian, Dutch, Polish, Turkish, Russian, Indonesian, Japanese, Korean, Chinese). Each language is a block of lines like these:

  tapToStart: 'Tap to start',
  play: 'Play',
  levelN: 'Level {n}',
  soClose: 'So close!',
  1. Find the text you want to change (Ctrl+F in your editor). The word before the colon is the key; never change it.
  2. Change only the words inside the quotes. If your text has an apostrophe, like Let's, put double quotes around the text: "Let's go!".
  3. Keep markers such as {n}: the game puts a number there.
  4. Change the same key in the other languages you use.
  5. If you use source/, run npm test: it checks that the 14 languages still have every key and every marker.

The sentences of the guided first levels are the keys g1a, g1b, g1c, g2a, g2b, g2c, and the one-sentence cards of new pieces start with l_. The guided sentences are also spoken: see recipe H.

9. Recipe F: make the levels easier or harder

The 60 levels are not drawn by hand: src/levels.js has the numbers of each level and the game builds the bubbles from them. The first world (levels 1 to 10) is three plain lists, one number per level:

const W1 = {
  fish: [12, 18, 24, 30, 36, 42, 48, 54, 60, 72],
  sp: [2, 3, 4, 4, 5, 5, 6, 6, 6, 7],
  slots: [4, 5, 6, 6, 7, 7, 8, 8, 8, 8],
};
Setting What it means Easier
fish How many creatures the level has. Always a multiple of 3. fewer
sp / nsp How many different kinds of creature appear. fewer
slots How many bubbles with creatures are on the screen at once. shipped values: 4 to 10
floats How many top bubbles are open at once (2, 3 or 4). more
kelp, lock, free, oyster How many kelp wraps, clam locks, free bubbles and pearl oysters the level has. fewer kelp and locks, more free bubbles
hard How mixed the creatures are, from 0 (grouped) to 0.65. lower
npm run levels
npm test

These two commands need Node.js; the main buyer guide explains how to install it, step by step.

10. Recipe G: change pearls and helper prices

export const COST = { scoop: 3, sweep: 3, whirl: 2, chance: 5 };

Change only the numbers. Keep the commas, braces and names exactly where they are. Pearls are earned by playing; the game has no store and no real-money purchases.

11. Recipe H: replace music, sounds and voice

Save your audio as MP3 with the same file name and replace the old file.

Recorded sound When it plays
assets/sfx/win.mp3 level complete
assets/sfx/fail.mp3 the tray is full, level lost
assets/sfx/star.mp3 each star on the win window
assets/sfx/pearl.mp3 pearls are earned
assets/sfx/unlock.mp3 a clam lock opens, a new-piece card appears, a decoration is placed
assets/sfx/gold.mp3 the Golden Fish completes a bubble
assets/sfx/oyster.mp3 a pearl oyster opens
assets/sfx/scoop.mp3 the Scoop helper
assets/sfx/sweep.mp3 the Sweep helper
assets/sfx/whirl.mp3 the Whirl helper
assets/sfx/chance.mp3 second chance is used

12. Recipe I: change the reef decorations

The home screen has 6 decoration spots. Open src/config.js and find PEDESTALS, one line per spot:

{ at: 5, x: 0.15, y: 0.62, opts: ['lighthouse', 'castle', 'tiki'] },

13. Recipe J: change colors, buttons and the font

14. Check and publish your changes

  1. Play the parts you changed on your computer (see Before you start), in a wide window and in a narrow one (F12, then Ctrl+Shift+M shows phone sizes).
  2. If you edited source/: in a terminal inside source/, run the commands below. The first checks the rules, the levels and the texts; the second copies the game to source/dist/.
npm test
npm run build
  1. Upload everything inside game/ (or source/dist/, if you built it) to your web hosting, replacing the old files.
  2. Open your game address and press Ctrl+F5. If you still see the old version, read the section about updates and cache in the main buyer guide.

15. If something goes wrong