Fireflip · Customization Guide · version 1.0.0 · Main buyer guide

Customization Guide

Make Fireflip your own game: new card pictures, backgrounds, your own logo and mascot, 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/ui/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 open any level at once: add ?debug=1 to the address, press F12, open the Console and type fireflip.level(30). These test tools do not exist 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 the language files of src/i18n/ (recipe F).

Start screen

Start screen, real screenshot with numbered parts 1 2 3 4
# What you see File to change
1 Logo assets/ui/logo.webp. The same file is used on the start screen, the menu and the win panel (recipe B).
2 Mascot asleep on a lantern assets/ui/boot-hero.webp. With the mascot switched off the game shows assets/ui/lantern.webp instead (recipe E).
3 "Tap to start" Text: key tapToStart in the files of src/i18n/ (recipe F). Its glow: #boot .tap in css/screens.css.
4 Background assets/bg/w1-p.webp, w1-l.webp and w1-w.webp: the first world, also used by the start screen, the menu and the Daily board (recipe D).

Menu

Menu, real screenshot with numbered parts 1 2 3 4 5 6
# What you see File to change
1 Stars earned Plate: assets/ui/pill.webp; star: assets/ui/star.webp.
2 Settings button assets/ui/round/gear.webp. The other round buttons are in the same folder.
3 Logo assets/ui/logo.webp. The same file is used on the start screen, the menu and the win panel (recipe B).
4 Flick, the mascot Six poses in assets/mascot/: wave, fly, cheer, worry, point, sleep (recipe E).
5 Play button Texts: keys play and level. Button: assets/ui/btn-amber.webp; icon: ic-play.webp; small ribbon: ribbon-name.webp.
6 Daily and Collection buttons Texts: keys daily and collection. Button: assets/ui/btn-indigo.webp; icons: ic-calendar.webp and ic-album.webp. Both can be switched off (recipe L).

Map of a world

Map of a world, real screenshot with numbered parts 1 2 3 4 5 6 7
# What you see File to change
1 World name Texts: keys worlds.village, worlds.market, worlds.woods, worlds.bridge, worlds.lake. Ribbon: assets/ui/ribbon-red.webp.
2 Finished level assets/ui/node-done.webp, with star.webp below it.
3 Next level to play The same node-done.webp, bigger and glowing (.node.now in css/screens.css).
4 Locked level assets/ui/node-lock.webp with lock.webp.
5 Star chest assets/ui/chest.webp (and chest-open.webp when it opens). How many stars and what it gives: recipe H.
6 Path of light Drawn by the game: its color is stroke in #map svg path, in css/screens.css. The place of each level on the path: PATH in src/app/screen-map.js.
7 Map background assets/bg/map-w1-*.webp to map-w5-*.webp, three files per world (recipe D).

A level (Whispering Woods, with locked cards)

A level (Whispering Woods, with locked cards), real screenshot with numbered parts 1 2 3 4 5 6 7 8 9 10 11 12
# What you see File to change
1 Pause button assets/ui/round/pause.webp.
2 Level number Text: key level. Ribbon: assets/ui/ribbon-red.webp.
3 Score Orb: assets/ui/orb.webp. The points of each pair: recipe H.
4 Stars and moves Stars: star.webp and star-dim.webp; moves icon: ic-album.webp. Moves of each level: recipe G.
5 Flick, the mascot Six poses in assets/mascot/: wave, fly, cheer, worry, point, sleep (recipe E).
6 Pairs in a row Lanterns: assets/ui/lantern.webp and lantern-off.webp.
7 Peek power Icon: assets/ui/peek.webp; name: key peek. Charges: recipe H.
8 Beacon power Icon: assets/ui/beacon.webp; name: key beacon. Charges: recipe H.
9 Card front with a Glimmer Frame: assets/cards/front.webp. Glimmer: a picture of assets/cards/w1/ to w5/ (recipe C).
10 Card back One per world: assets/cards/back-1.webp to back-5.webp; golden levels use back-gold.webp (recipe C).
11 Locked card Vines: assets/ui/vines.webp; lock: assets/ui/lock.webp. How many per level: locked in recipe G.
12 World background assets/bg/w1-*.webp to w5-*.webp: one set per world (recipe D).

Panels share the same pieces: the parchment panel is assets/ui/panel-tall.webp (and panel-wide.webp), title ribbons are ribbon-red.webp and ribbon-amber.webp, the small name ribbon is ribbon-name.webp, the buttons are btn-amber.webp and btn-indigo.webp, and the round buttons are in assets/ui/round/.

Pause panel, real screenshot
Pause: Resume, Restart, Map, music and sound on or off, Settings. Texts: keys paused, resume, restart, map.
Settings panel, real screenshot
Settings: volumes, vibration, Reduce motion and the language list. Icons: ic-music, ic-sound, ic-vibrate, ic-motion, ic-globe.
Level complete panel, real screenshot
Level complete: star.webp, orb.webp, the mascot cheer.webp and the rising lanterns (lantern.webp). Texts: keys levelComplete, score, moves, newGlimmers, next.
So close panel, real screenshot
Out of moves: the mascot worry.webp, lanterns lantern.webp and lantern-off.webp. Texts: keys soClose, pairsFound, plusMoves, free, tryAgain.
Collection screen, real screenshot
Collection: background assets/bg/shelf-*.webp; the Glimmers of each world and their names (recipe C).
Daily screen, real screenshot
Daily board: icon flame.webp; texts daily, dayStreak, bestMoves, comeBack. Its boards: DAILY_BOARDS in src/config/levels.js.
Level card, real screenshot
Level card: the goal, the moves for each star and the charges of the two powers. Texts: keys goalPairs, goalMoves, noLimit, bonusLevel.
Rule card, real screenshot
The rule card of a new world. Texts: mech.market, mech.woods, mech.bridge, mech.lake (a title and a sentence each). Wind picture: wind.webp.
A level of Breezy Bridge, real screenshot
Breezy Bridge: the wind swaps two face-down cards every few moves (swapEvery, recipe G).
A level of Moonlit Lake, real screenshot
Moonlit Lake: each Glimmer is matched with its silhouette. The silhouette card uses assets/cards/front-moon.webp; its dark color is --shadow-ink in css/theme.css.
A level on a phone held upright, real screenshot
A phone held upright: the same pictures; the board turns so the cards stay big.

4. Recipe A: replace a picture

All pictures are WebP files in assets/: ui/ (buttons, ribbons, panels, icons), bg/ (backgrounds), cards/ (card backs, fronts and Glimmers) and mascot/. 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.
  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 backgrounds in assets/bg/). Keep the drawing in the same position inside the picture.
  4. Export as WebP with the exact same name, for example orb.webp, and replace the old file.
  5. 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/ui/logo.webp (recipe A).
  2. Name in the browser tab: change title: 'Fireflip' at the top of src/config/game.config.js, and the text between <title> and </title> in index.html (shown while the game loads). The line description in index.html is the text search engines show.
  3. Tab icon: the line rel="icon" in index.html points to assets/ui/star.webp. Point it to another picture, or replace that file.

6. Recipe C: change the cards and the Glimmers

Each world has 12 Glimmers, one picture each, in its own folder (assets/cards/w1/ to w5/). The list of each world is in src/config/card-sets.js:

  w1: {
    folder: 'assets/cards/w1',
    back: 'assets/cards/back-1.webp',
    cards: [
      ['ember-fox', 'Ember Fox'],
      ['star-frog', 'Star Frog'],
  1. Replace a Glimmer: save a square picture (transparent background works best) over the old file, for example assets/cards/w1/ember-fox.webp.
  2. Rename it: change the second text of its line ('Ember Fox'). This is the name shown in the Collection; it is the same in every language.
  3. Add or use other pictures: put the files in the folder and write one line per picture: the file name without .webp, then the name. The silhouettes of the lake and the note each card sings are made by the game from this list.
  4. Keep about 12 pictures per world: the biggest board has 16 pairs and borrows Glimmers from the worlds before.
  5. Card back of a world: back-1.webp to back-5.webp; golden levels use back-gold.webp. Card front (the frame behind the Glimmer): front.webp; the lake silhouette card: front-moon.webp.

7. Recipe D: change the backgrounds and the worlds

Each place has three pictures: -p for portrait screens, -l for landscape and -w for very wide screens (the sides continue the scene). Replace all three with pictures of the same size. Keep the middle calm: the cards and panels sit there.

World (id) Levels Level background Map background Cards
Firefly Village
village
1 to 12 assets/bg/w1-p.webp, w1-l.webp, w1-w.webp assets/bg/map-w1-*.webp assets/cards/w1/, back-1.webp
Lantern Market
market
13 to 24 assets/bg/w2-p.webp, w2-l.webp, w2-w.webp assets/bg/map-w2-*.webp assets/cards/w2/, back-2.webp
Whispering Woods
woods
25 to 36 assets/bg/w3-p.webp, w3-l.webp, w3-w.webp assets/bg/map-w3-*.webp assets/cards/w3/, back-3.webp
Breezy Bridge
bridge
37 to 48 assets/bg/w4-p.webp, w4-l.webp, w4-w.webp assets/bg/map-w4-*.webp assets/cards/w4/, back-4.webp
Moonlit Lake
lake
49 to 60 assets/bg/w5-p.webp, w5-l.webp, w5-w.webp assets/bg/map-w5-*.webp assets/cards/w5/, back-5.webp

8. Recipe E: change the mascot or turn it off

  features: {
    mascot: false,

9. Recipe F: change texts and translations

All texts players read are in src/i18n/: en.js (English) and one file per language (pt.js, es.js, de.js...). Each text is a line like these:

  tapToStart: 'Tap to start',
  play: 'Play',
  level: '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. A text missing in a language shows in English.
  5. Add a language: copy en.js with the new code (for example sv.js), translate it, and add a line like ['sv', 'Svenska'], to languages in src/config/game.config.js.
  6. Remove a language: delete its line from languages.

10. Recipe G: make the levels easier or harder

Open src/config/levels.js. Each world has 12 lines, one per level, for example:

      { cols: 4, rows: 3, limit: 16, peek: 3 },
Setting What it means Easier
cols, rows Size of the board in landscape (in portrait the game turns it). The number of cards must be even. smaller board
shape Optional drawing of the board, one text per row: X is a card, . is a hole. -
limit Moves the player has (one move = two cards). 0 = no limit. more moves, or 0
peek Seconds every card is shown at the start. 0 = no peek. more seconds
locked How many cards are tied by vines. fewer
swapEvery Every N moves the wind swaps two face-down cards. a bigger N, or remove it
requests true = the mascot asks for a Glimmer (bonus points and one move back). -
shadows true = each Glimmer is matched with its silhouette. remove it
golden true = bonus level with double points. -
stars Optional [moves for 2 stars, moves for 3 stars]. Without it: 2 x pairs and 1.5 x pairs + 1. bigger numbers
npm test
npm run balance

11. Recipe H: change powers, rewards and points

Open src/config/game.config.js:

  startCharges: { peek: 3, beacon: 2 },
  starLevelReward: { peek: 1, beacon: 0 },
  chestEvery: 9,
  chestReward: { peek: 1, beacon: 1 },
  rescueMoves: 5,
  helpAfterFail: { peek: 1, moves: 2, times: 3 },

Change only the numbers. Keep the commas, braces and names exactly where they are. The game has no store and no real-money purchases.

12. Recipe I: replace music and sounds

Music, sound effects and art are included with the template; you can keep, replace or remove them. Sound files are MP3 in assets/audio/music/ and assets/audio/sfx/, and src/config/audio.js says which file each sound uses:

  sfx: {
    deal: ['deal-1.mp3', 'deal-2.mp3'],
    flip: ['flip-1.mp3'],
    ...
  },
  music: { menu: 'menu.mp3', game: 'game.mp3' },
Sound names When they play
flip, flipBack a card turns, cards turn back
match, miss a pair is found, two cards do not match
note the note each Glimmer sings (it climbs with pairs in a row)
trio, streak, lucky three in a row, five in a row, a lucky pair
request, requestDone a new request, a request met (Lantern Market)
locked, creak, unlock a tap on a locked card, the vines pull and snap (Whispering Woods)
gust, swap the wind and the swap (Breezy Bridge)
peek, beaconArm, beacon the two powers
win, rise, phew, perfect, star, count, bonus the end of a won level and the result panel
lose, rescue, lowMoves out of moves, +5 Moves, the last moves
chest, reward, discover, world, nodeOpen star chest, new Glimmer, new world, a level opens on the map
deal, point, panel, button, back, toggle, whoosh cards dealt, points, panels, buttons and screen changes

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

14. Recipe K: change the feel (speed, effects, Reduce motion)

src/render/feel.js has every timing and effect of the game in one place, with a comment on each line. Times are in seconds. Some examples:

15. Recipe L: switch the Daily board or the Collection off

In src/config/game.config.js, features has three switches. Change true to false: daily removes the Daily button of the menu, collection removes the Collection button, and mascot is recipe E.

  features: {
    mascot: true,
    daily: false,
    collection: false,
  },

16. 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 save; 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.

17. If something goes wrong