A word every visit, rendered huge over a full-screen background.
Built for curiosity, aesthetics, and zero friction.
Live Demo → · Features · How It Works · API
WordWise is a single-page word-of-the-day app that serves a random English word on every visit — with its definition, phonetic pronunciation, a usage example, and a full-screen nature landscape photo or video background. It started as a hardcoded demo and grew into a polished, deployable product.
Maturity: Maintained. Releases, changelog, and issue tracking are active. See ARCHITECTURE.md for system design.
| Detail | |
|---|---|
| Word pool | 20,000+ common English words (3–12 letters), bundled as a flat file |
| Curated fallback | 30 hand-picked words with pre-written definitions — always servable |
| Dictionary API | On-the-fly lookups from the Free Dictionary API, cached in memory |
| Audio | Pronunciation play button when the dictionary provides an audio file |
| Safety | All dictionary text escapes HTML before rendering (XSS protection) |
| Detail | |
|---|---|
| Source | Pexels API — free, no rate limits on the free plan |
| Content | Nature landscape photos and videos, searched with orientation=landscape |
| Mix | 50/50 random between photo and video on each request |
| Quality | Highest resolution available (original for photos, UHD for videos) |
| Fallback | If one type fails, the other serves as backup |
| Attribution | Photographer/videographer name linked to original Pexels page |
A thin glass-blur strip across the top of the screen showing the current time in 12 major business timezones:
| Abbr | City, State, Country | Fun Fact |
|---|---|---|
| PT | Los Angeles, California, USA | Home to Silicon Valley and Hollywood |
| MT | Denver, Colorado, USA | Only U.S. city to host the Olympics at a mile high |
| CT | Chicago, Illinois, USA | Invented the skyscraper and the brownie |
| ET | New York, New York, USA | NYSE opens at 9:30 ET — busiest trading hour on Earth |
| BRT | São Paulo, SP, Brazil | Largest city in the Americas outside North America |
| GMT | London, England, UK | World's timekeeping zero — all timezones measured against it |
| CET | Berlin, Germany | DST transition affects most of Europe |
| GST | Dubai, UAE | No daylight saving — sunrise barely shifts year-round |
| PKT | Karachi, Sindh, Pakistan | One of few countries using a 30-minute offset |
| IST | Mumbai, Maharashtra, India | Single timezone for 1.4 billion people |
| CST | Beijing, China | Spans 5 geographic timezones but uses only one |
| JST | Tokyo, Japan | Timezone unchanged since 1888 |
- Hover any timezone → a smooth tooltip fades in with the city, state/province, country and a fun fact about that timezone
- Date on the right → hover for a weird historical fact about that day in history
- Times update every 30 seconds
On phones (<768px), the timezone bar hides and a compact clock appears in the top-right corner showing:
- Today's date
- The user's opposite timezone time (IST→EST fixed, EST→IST fixed, everyone else gets randomized)
- iOS Safari: Dynamic viewport height (
100dvh), safe area insets for notch phones,viewport-fit=cover, touch target minimum 44px,-webkit-text-size-adjust - Android Chrome: Overscroll prevention, tap highlight removal, sans-serif font stack
- Desktop: Hover-only tooltips, wider timezone bar, keyboard accessible
- Reduced motion:
prefers-reduced-motiondisables transitions - Responsive layout: Clamp-based font sizing scales from 3.5rem to 10rem
- 4-second client fallback: If the API doesn't respond in 4s, a pre-bundled word renders automatically
- Server timeouts: All outbound API calls use
AbortControllerwith 3–4 second timeouts - Graceful degradation: Failed background → just the word. Failed dictionary → curated word. Everything fails → em-dash
- 3 attempts max for dictionary lookups before falling back to curated words
- One-command Vercel deploy via included
vercel.json - CI pipeline (
lint-and-testcheck) + Dependabot for npm updates - Main branch protected — force pushes and deletions blocked, status checks required
- Zero cookies, zero analytics, zero tracking scripts
- No authentication, no user accounts, no data storage
- Outbound requests only to Free Dictionary API and Pexels API
- Full AGPL-3.0 source
Visitor opens page
│
▼
┌─────────────────────────────────────┐
│ Browser loads index.html │
│ • Timezone bar renders instantly │
│ • Mobile clock renders instantly │
│ • Starts 4s fallback timer │
│ • Fetches /api/word │
└──────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Server receives request │
│ • Checks in-memory cache │
│ • 50% chance: serve cached word │
│ (instant, no external calls) │
│ • Otherwise: │
│ 1. Pick random word from 20k │
│ 2. Fetch definition from DictAPI │
│ 3. Cache the result │
│ 4. Fetch random Pexels bg (3s) │
│ • Return JSON to client │
└──────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Client renders │
│ • Cancel fallback timer │
│ • Word in huge centered text │
│ • Phonetic + definition below │
│ • Play button if audio exists │
│ • Full-screen video or photo bg │
│ • Photographer credit │
└─────────────────────────────────────┘
If the API takes longer than 4 seconds (cold start, slow network), the fallback timer fires and renders a curated word from memory immediately.
Returns a random word with definition and background media.
Response:
{
"word": "serendipity",
"phonetic": "/ˌsɛrənˈdɪpɪti/",
"definition": "the occurrence of events by chance in a happy way",
"example": "Finding that book was pure serendipity.",
"partOfSpeech": "noun",
"audioUrl": null,
"background": "https://images.pexels.com/photos/...",
"backgroundType": "photo",
"photographer": "Jane Doe",
"photoUrl": "https://pexels.com/photo/..."
}| Field | Type | Description |
|---|---|---|
word |
string | The word |
phonetic |
string | Pronunciation (may be empty) |
definition |
string | Short definition |
example |
string | Usage example (may be empty) |
partOfSpeech |
string | e.g. "noun", "adjective", "verb" |
audioUrl |
string|null | Pronunciation audio URL |
background |
string|null | Full-resolution photo/video URL |
backgroundType |
string | "photo" or "video" |
photographer |
string|null | Creator name |
photoUrl |
string|null | Link to original Pexels page |
- Node.js 18+ (native
fetchsupport required) - npm
git clone https://github.com/sparshsam/wordwise.git
cd wordwise
npm install
npm startOpen http://localhost:3000.
npm i -g vercel
vercel --prodThe vercel.json routes all requests to the Express server.
| Variable | Required | Default | Purpose |
|---|---|---|---|
PORT |
No | 3000 |
HTTP server port |
PEXELS_API_KEY |
No | Embedded key | Your own Pexels API key for background media |
wordwise/
├── docs/
│ └── architecture.md # System architecture and data flow
├── routes/
│ └── word.js # Word selection, dictionary lookup, Pexels fetch
├── views/
│ ├── index.html # Main page (inline CSS + JS)
│ └── archive.html # Archive placeholder
├── public/
│ ├── favicon.svg # SVG favicon
│ ├── favicon.png # PNG fallback favicon
│ └── og-image.png # Open Graph social preview image
├── assets/
│ ├── screenshot-main.png # README hero screenshot
│ └── screenshot-main.svg # Vector fallback
├── words.json # 30 curated fallback words
├── words.txt # 20,000-word pool (~190 KB)
├── server.js # Express entry point
├── vercel.json # Vercel deployment config
├── package.json
├── LICENSE # AGPL-3.0
├── CHANGELOG.md
├── CONTRIBUTING.md
├── SECURITY.md
└── .github/
├── dependabot.yml
└── workflows/
└── ci.yml # Lint + smoke-test pipeline
| Layer | Technology |
|---|---|
| Runtime | Node.js 18+ |
| Framework | Express 4 |
| Dictionary | Free Dictionary API |
| Media | Pexels API |
| Deployment | Vercel (serverless Node — @vercel/node) |
| CI | GitHub Actions (syntax check + curl smoke test) |
- No user data is collected, stored, or transmitted in any form
- No cookies, no analytics, no tracking scripts of any kind
- No authentication — the app is fully read-only; there is nothing to log into
- Outbound requests are limited to two services: Free Dictionary API (word definitions) and Pexels API (photo/video URLs)
- Input handling: All dictionary content is sanitized through
escapeHtml()before rendering to prevent XSS from API responses - API key: Embedded Pexels key has read-only access to public assets only
See SECURITY.md for the full policy.
- Platform: Vercel (primary, tested). Works on any Node.js host — Railway, Render, Fly.io, your own VPS.
- Cold starts: First hit after inactivity takes 1–4s (serverless cold start + API calls). The 4s fallback ensures the user always sees something.
- Memory: The 20,000-word pool uses ~190 KB on disk. The in-memory cache grows with unique word lookups; expect ~100–300 MB under normal use.
- Branch protection: Main branch requires
lint-and-testCI check to pass. Force pushes and deletions blocked.
WordWise should remain tiny, fast, and peaceful. The roadmap expands the daily ritual without turning the app into a social network, learning platform, or account system.
- Random word with dictionary definitions
- Landscape nature photo/video backgrounds
- Audio pronunciation support
- Desktop timezone bar with hover tooltips
- Mobile opposite-timezone display
- Date hover with historical facts
- One-click Vercel deployment
- Daily word archive — browse past generated words with their definitions, media credits, and dates.
- Share-once links — create a stable link for a specific word/background pairing without accounts.
- Overlay controls — user-chosen opacity, contrast, and readability settings saved locally.
- Word frequency filter — common, intermediate, advanced, and rare-word modes.
- Better fallback packs — larger curated offline set with definitions, examples, and parts of speech.
- Keyboard shortcuts — refresh word, play audio, copy word, copy definition, and hide/show UI.
- Self-hosted dictionary mode — remove dependency on external dictionary calls for fully self-contained deployments.
- Local archive mode — optionally store viewed words in local storage only, never server-side.
- Theme packs — forest, ocean, mountain, desert, rain, night sky, and minimal solid-background modes.
- Pronunciation improvements — clearer audio fallback logic, phonetic formatting, and source attribution.
- Multilingual interface — translate app chrome while keeping English words as the core content.
- PWA support — installable daily-word screen with offline fallback words.
- Personal lexicon — a private, local-first collection of favourite words, copied definitions, and saved media moments.
- Exportable word journal — export favourite words as JSON, Markdown, or a printable PDF.
- Calm learning mode — gentle review prompts without streak pressure, points, ads, or dopamine traps.
- Public domain dictionary pack — ship a durable, inspectable dictionary dataset for long-term self-hosting.
- Embeddable widget — tiny iframe/script version for personal websites, blogs, dashboards, and digital gardens.
- Open archive format — portable schema for word, definition, source, media attribution, and timestamp metadata.
Any Web3 idea should be optional and almost invisible. WordWise is not a wallet app.
Possible proof-oriented features:
- Word moment receipts — locally generate a small receipt for a word/background/date pairing.
- Archive integrity snapshots — hash a public daily archive and optionally anchor the hash through an OpenProof-style flow.
- Creator attribution proofs — preserve media attribution metadata in export receipts.
- Personal lexicon verification — let users prove a saved word journal has not been altered without publishing the journal itself.
What should never happen:
- no token
- no NFT marketplace
- no wallet required to use the app
- no user tracking
- no account-gated vocabulary
- no permanent onchain storage of personal journals
Base, if used, should be a quiet verification layer for public archives and exported receipts, not the center of the product.
WordWise is a small ritual app: one word, one landscape, one moment of attention.
Its place in the broader ecosystem is calm daily utility:
- Curiosity without accounts — language discovery should not require a profile.
- Beauty without tracking — visual polish does not need analytics or surveillance.
- Learning without pressure — no streak anxiety, no leaderboards, no productivity theatre.
- Portability over lock-in — saved words and archives should be exportable.
- Proof where useful — receipts and hashes can preserve archives without exposing private reading habits.
The ambition is not to become the biggest dictionary app. The ambition is to remain a little window that opens cleanly every day. 🌿
WordWise is a read-only word display app. It does not:
- Store user history or preferences server-side
- Provide spaced repetition, quizzes, or learning tools
- Offer user accounts, authentication, or personalization
- Support offline word archives (browser-level caching only)
- Guarantee dictionary availability (depends on Free Dictionary API)
- Provide medical, legal, or academic definitions
Contributions are welcome. See CONTRIBUTING.md for setup, code style, and pull request guidelines.
If you use WordWise in research or publications, please cite the repository using the metadata in CITATION.cff.
AGPL-3.0. See LICENSE for details.
Last updated: June 2026
