Contents
- Overview and package contents
- Quick installation by FTP
- Requirements and hosting
- Controls and how the game works
- Screens and controls explained
- Settings available
- Map of the files
- Customize your copy
- Languages, sound and accessibility
- Saved progress and privacy
- Optional advertising
- Optional development
- Updating the game
- Common problems
- Frequently asked questions
- Support and version history
- For AI assistants
1 Overview and package contents
Word-category card game with 12 worlds, endless levels, stars and combos. Linky has 60 cosmetic items. Daily gifts and a daily challenge use local progression.
No native app project, accounts, cloud saves, online ranking or real-money purchases. Coins are earned in play. Ads are optional and off by default; the buyer supplies the provider.
This manual describes version 1.0.0. Open documentation/index.html by double-clicking it. This guide works without internet.
DOCUMENTATION.html
documentation/index.html
game/
source/
THIRD-PARTY-LICENSES/
2 Quick installation by FTP
Installing takes a few minutes. It needs no build step, terminal, database or PHP.
- Extract the purchased ZIP on your computer.
- Open the
game/folder. Keep its files and subfolders together. - Upload only the contents of
game/by FTP or your hosting file manager to an empty folder, such aspublic_html/my-game/. - Open
https://your-domain.example/my-game/in a modern browser.
index.html on your computer. The game must be opened through an HTTP(S) address.
3 Requirements and hosting
- A current version of Chrome, Edge, Firefox or Safari on a computer, tablet or phone.
- Any static hosting over HTTP or HTTPS. HTTPS is recommended.
- No npm, terminal, database, PHP, account or build step. The game loads everything from your folder.
The example above uses a subfolder. Keep all files together so the relative paths keep working.
To test before choosing a host, run any static web server on your computer or upload the game to a private test subfolder first.
4 Controls and how the game works
Place gold category cards at the top, then move matching words into them. Stack words of the same category in columns to reveal hidden cards. Draw from the deck when needed. Drag cards, or select a card and its destination.
Use mouse or touch for cards and the deck. Keyboard focus activates buttons with Enter or Space. The helpers are Hint, Undo and Joker; Restart starts the level again.
Each move matters. Complete all categories before moves run out. Stars and combos reward progress. Worlds contain 10 levels; artwork and music repeat after world 12.
5 Screens and controls explained
The captures below are real game screens from version 1.0.0, in English. Numbered marks point to the controls, and the legend under each capture explains them.
Marks on the screenshot
- Game logo.
- Play or continue your saved campaign.
- Settings available
Marks on the screenshot
- Gold category cards.
- Draw pile and remaining cards.
- Place gold category cards at the top, then move matching words into them. Stack words of the same category in columns to reveal hidden cards. Draw from the deck when needed. Drag cards, or select a card and its destination.
- Hint, Undo, Joker and Restart.
Marks on the screenshot
- Linky's closet contains hats, cards, sparkles, dances and faces. Unlock items by progression or earned coins. Preview and equip items; the buyer edition has no real-money checkout.
- Choose a cosmetic category and an item.
Marks on the screenshot
- If silent, interact first, then enable music, sounds and Linky's voice in Settings. Voice recordings only cover English, Portuguese and Spanish. Calm mode reduces motion; Large text enlarges card words.
- The game and this guide have 14 interface languages. Recorded voices are English, Portuguese and Spanish only. Settings also include music, sound, voice, vibration, Linky, large text and calm mode.
6 Settings available
The game and this guide have 14 interface languages. Recorded voices are English, Portuguese and Spanish only. Settings also include music, sound, voice, vibration, Linky, large text and calm mode.
Browsers need a first interaction, such as pressing Play, before audio can start. The game pauses when it loses focus.
7 Map of the files
| File or folder | What it is |
|---|---|
game/index.html
|
Entry page of the game. |
game/js/
|
Built game code, styles, images and audio. |
game/css/
|
Built game code, styles, images and audio. |
game/solitaire.config.js
|
Edit game/solitaire.config.js without a build. storageKey isolates saved progress; ads.enabled enables your own integrated provider. This setting does not change the illustrated title. Direct edits belong in game; source holds matching scripts and translation tools. |
source/i18n/
|
Edit source/i18n/, run node tools/gen-langs.cjs from source, and copy the generated js/langs/ and js/langs.js to game. Keep each language module and rerun tests. |
game/js/core.js
|
Place gold category cards at the top, then move matching words into them. Stack words of the same category in columns to reveal hidden cards. Draw from the deck when needed. Drag cards, or select a card and its destination. |
game/js/ads.js
|
Disabled by default. Integrate your approved SDK and consent. Call started only when visible; resolve done only after confirmed completion. Rewards require both. Cancellation, error or unavailable inventory must not grant rewards. One ad at a time; remove your overlay on timeout. |
source/tests/run.mjs
|
No build or dependency installation is needed to edit the playable game. Keep game and source scripts synchronized. For tests and language generation only, use Node.js 20 or newer and the commands below. |
game/assets/fonts/
|
Self-hosted Baloo 2, Nunito and Fredoka fonts use SIL Open Font License. Keep the complete notices in THIRD-PARTY-LICENSES and game/assets/fonts. No external font service is required. |
8 Customize your copy
Edit game/solitaire.config.js without a build. storageKey isolates saved progress; ads.enabled enables your own integrated provider. This setting does not change the illustrated title. Direct edits belong in game; source holds matching scripts and translation tools.
window.SOLITAIRE_CONFIG = {
storageKey: 'my-word-game.save.v1',
ads: {enabled:false, graceSec:180, minGapSec:120, startTimeoutSec:2.5, timeoutSec:180}
};
To change the illustrated title, icons, artwork, rules or text, edit the optional source edition and rebuild. Keep the existing proportions when replacing visuals. Do not edit hashed build file names without updating their references.
9 Languages, sound and accessibility
The game and this guide have 14 interface languages. Recorded voices are English, Portuguese and Spanish only. Settings also include music, sound, voice, vibration, Linky, large text and calm mode.
Edit source/i18n/, run node tools/gen-langs.cjs from source, and copy the generated js/langs/ and js/langs.js to game. Keep each language module and rerun tests.
10 Saved progress and privacy
Default localStorage key: solitaire-links.buyer.save.v1. Saves include progress, coins, cosmetics and settings. No cloud or account. Different subfolders share origin storage, so use a different storageKey for independent installations.
- There is no account and no cloud sync. Records stay on this device.
- Private mode, storage restrictions, clearing site data or changing the address can remove access to saved progress. The game keeps running without saving.
Back up your configuration and exported save before updating. Keep storageKey unchanged to preserve access to progress. Upload all build files together; do not rename hashed assets.
11 Optional advertising
Disabled by default. Integrate your approved SDK and consent. Call started only when visible; resolve done only after confirmed completion. Rewards require both. Cancellation, error or unavailable inventory must not grant rewards. One ad at a time; remove your overlay on timeout.
// Contract for window.SOLITAIRE_AD_PROVIDER (supply your own approved SDK)
// init(): optional setup
// available(kind): boolean
// show(kind, placement, started): Promise<result>
// kind: 'interstitial' | 'rewarded'
// result: 'done' | 'skipped' | 'unavailable' | 'error'
// Call started() only once the ad is visible; cancel if it returns false.
// Resolve 'done' ONLY after a real confirmed completed-view event.
// All other outcomes return without reward; only one ad at a time.
// Default placements:
// level_end, double_reward, extra_moves, stuck_joker, shop_coins, booster
// ads: {enabled:false, graceSec:180, minGapSec:120,
// startTimeoutSec:2.5, timeoutSec:180, placements:{...}}
// If your SDK times out, close its own overlay.
12 Optional development
This section is only for changing the source. The game/ folder already contains the playable build, so hosting needs no Node.js.
No build or dependency installation is needed to edit the playable game. Keep game and source scripts synchronized. For tests and language generation only, use Node.js 20 or newer and the commands below.
cd source
node tests/run.mjs
# Only after editing translation JSON files:
node tools/gen-langs.cjs
13 Updating the game
Back up your configuration and exported save before updating. Keep storageKey unchanged to preserve access to progress. Upload all build files together; do not rename hashed assets.
Upload the new contents of game/ over the old files, keeping the names and folders.
Reload the game. If the old version still appears, clear the cache as described below.
Clearing the cache without losing progress
Progress is stored in this browser, not on the server. Clearing cached images and files, or doing a hard reload, keeps your progress.
Computer: press Ctrl+F5 on Windows and Linux, or Cmd+Shift+R on macOS. Phone: in the browser settings, choose the option to clear cached images and files.
Do not choose cookies and site data, or clear site data, for the game's address. That deletes the local save.
14 Common problems
-
Blank page: make sure you uploaded the contents of
game/, opened the HTTP(S) address and checked the browser console for scripts that failed to load. Thesource/folder is not the playable website. -
Works on the computer but not on the server: the game does not run from a file on your computer (
file://). Use a static web host or any static local server. -
Missing textures or sound: confirm the complete upload and the file name case, and that
.mp3,.js,.cssand font files are served with correct types.
If silent, interact first, then enable music, sounds and Linky's voice in Settings. Voice recordings only cover English, Portuguese and Spanish. Calm mode reduces motion; Large text enlarges card words.
15 Frequently asked questions
Does it need PHP or a database?
Does it work offline?
Does it work on phones?
16 Support and version history
Self-hosted Baloo 2, Nunito and Fredoka fonts use SIL Open Font License. Keep the complete notices in THIRD-PARTY-LICENSES and game/assets/fonts. No external font service is required.
Support and customization: willian@polargames.com.br. Include your purchase or licence reference. This guide does not promise response times or a schedule of future updates.
Support request
When you write to support, include the browser and device, the game version, the page address, the steps that caused the problem, a screenshot and the first error shown in the browser console. Never send passwords, payment details or secret keys.
For AI assistants
Edit game/solitaire.config.js without a build. storageKey isolates saved progress; ads.enabled enables your own integrated provider. This setting does not change the illustrated title. Direct edits belong in game; source holds matching scripts and translation tools.
Default localStorage key: solitaire-links.buyer.save.v1. Saves include progress, coins, cosmetics and settings. No cloud or account. Different subfolders share origin storage, so use a different storageKey for independent installations.
No build or dependency installation is needed to edit the playable game. Keep game and source scripts synchronized. For tests and language generation only, use Node.js 20 or newer and the commands below.
window.SOLITAIRE_CONFIG = {
storageKey: 'my-word-game.save.v1',
ads: {enabled:false, graceSec:180, minGapSec:120, startTimeoutSec:2.5, timeoutSec:180}
};