A Spanish word game app with three games built on the same word engine.
All three games use the same word engine. Tiles reveal after each guess:
A Wordle-style game. Pick a word length (4, 5, 6, or 7 letters) and guess the word in 6 attempts. No timer, no rounds — just you and the word. On win or loss a new word is loaded automatically.
Stats (wins, losses, streak) are tracked per word length in the browser session, or saved to your account when logged in.
A TV-show inspired game with 5 rounds of 6-letter words, a bingo card, and a ball pit. The goal is to complete a bingo.
Each round:
Bingo card — 5×5 B-I-N-G-O grid (numbers 1–75, center FREE). Complete any row, column, or diagonal to win. Numbers are marked from word guesses, green balls, and gold balls.
Scoring (logged-in users): 10 points per word guessed, +25 bonus for bingo.
An advanced variant with 5 rounds of 7-letter words and a hidden puzzle word (12–13 letters). The goal is to solve the puzzle word.
Each round:
Puzzle word — Displayed as a row of tiles, hidden positions show ?. Once at least one letter is revealed, you can attempt to guess the full puzzle word at any time. Guess correctly to win early; a wrong guess has no penalty.
Scoring (logged-in users): 10 points per word guessed, +50 bonus for solving the puzzle word.
The UI is available in Spanish (default), English, and Dutch. Toggle between them using the flag buttons in the header. All words in play are always Spanish.
npm install
Copy .env.example to .env and fill in the values:
cp .env.example .env
DATABASE_URL="postgres://root:mysecretpassword@localhost:5432/local"
ORIGIN="http://localhost:5173"
BETTER_AUTH_SECRET="your-32-char-secret-here"
Generate a secure secret:
openssl rand -base64 32
Using Docker:
docker run -d \
--name palingo-db \
-e POSTGRES_USER=root \
-e POSTGRES_PASSWORD=mysecretpassword \
-e POSTGRES_DB=local \
-p 5432:5432 \
postgres:16
npm run db:migrate
npm run db:seed
This loads the Spanish word list into the words table.
npm run dev
Open http://localhost:5173.
npm run build
npm run preview
For deployment, install the appropriate SvelteKit adapter for your target environment (Node, Vercel, Cloudflare, etc.).
Authentication is optional — all games are playable without an account.
Creating an account enables persistent score and streak tracking across all three games.
Sign in with Google, Apple, or Microsoft on the /login page.
The app includes a service worker and web manifest. It can be installed on mobile and desktop via the browser's "Add to Home Screen" / install prompt.
The app requires an internet connection. Attempting to play offline shows an error message.
src/
app.css # Tailwind v4 theme tokens
lib/
game/
word-engine.ts # Shared Wordle logic (evaluateGuess, applyGuess)
lingo-engine.ts # Lingo-specific logic (bingo card, ball pit, timer)
components/
word/ # Shared tile/row/board/keyboard components
lingo/ # CountdownTimer, BallPit, BingoCard
superlingo/ # LetterBallPit, PuzzleWord
LangToggle.svelte # Language switcher
i18n/
translations.ts # ES + EN + NL strings
lang.svelte.ts # Reactive language store
server/
db/
schema.ts # Drizzle schema (words, scores, auth tables)
routes/
+layout.svelte # Root layout with offline banner
+page.svelte # Home page
login/ # Auth pages
palabra-del-dia/ # Wordle game
lingo/ # Lingo game
superlingo/ # SuperLingo game
static/
manifest.json # PWA manifest
sw.js # Service worker