# asbedb/scapedle architecture

> Architecture diagram of the GitHub repository asbedb/scapedle, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/asbedb/scapedle
- Repository: https://github.com/asbedb/scapedle

## Overview

Scapedle is a daily OSRS-themed word-guessing game. The Sydney-date server load selects the shared daily item, builds a length-indexed dictionary, and provides today/yesterday metadata; the page initializes client game data, then players start, enter and validate guesses, use hints or give up, and see/share the outcome. Browser storage preserves progress between visits. The README documents static-first daily publishing and deterministic selection; deployment details are represented only as a documented capability, since sampled runtime code does not show that publishing flow.

Main entry points: [`src/lib/components/GameBoard.svelte`](https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameBoard.svelte) (Game board), [`src/routes/+page.svelte`](https://github.com/asbedb/scapedle/blob/main/src/routes/%2Bpage.svelte) (Game page), [`src/routes/+page.server.ts`](https://github.com/asbedb/scapedle/blob/main/src/routes/%2Bpage.server.ts) (Daily load), [`src/lib/stores/gameState.svelte.ts`](https://github.com/asbedb/scapedle/blob/main/src/lib/stores/gameState.svelte.ts) (Game state)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_daily["Daily puzzle"]
  node_page["Daily load<br/>[+page.server.ts]"]
  node_words["OSRS wordlist<br/>[wordList.ts]"]
  node_dailydata["Puzzle data"]
end

subgraph group_game["Gameplay"]
  node_state["Game state"]
  node_board["Game board<br/>[GameBoard.svelte]"]
  node_rows["Guess rows<br/>[GameRows.svelte]"]
  node_keyboard["Keyboard input<br/>[Keyboard.svelte]"]
  node_hint["Hint control<br/>[HintButton.svelte]"]
  node_giveup["Give up"]
  node_result["Game result"]
  node_invalid["Invalid guess"]
  node_start["Start overlay"]
end

subgraph group_presentation["Game interface"]
  node_dailyui["Game page<br/>[+page.svelte]"]
  node_timer["Daily timer<br/>[Timer.svelte]"]
  node_emoji["Emoji hints<br/>[EmojiHint.svelte]"]
  node_number["Puzzle number<br/>[WordNumber.svelte]"]
  node_count["Dictionary count<br/>[WordCount.svelte]"]
  node_yesterday["Yesterday's word"]
  node_title["Site title<br/>[SiteTitle.svelte]"]
end

subgraph group_community["Community information"]
  node_about["About embed<br/>[AboutEmbed.svelte]"]
  node_discord["Discord link"]
  node_github["GitHub link<br/>[GitHubEmbed.svelte]"]
end

node_player(("Player"))
node_storage[("Browser storage")]
node_share(("Share target"))
node_staticdeploy["Static hosting"]

node_page -->|"reads items"| node_words
node_page -->|"returns puzzle data"| node_dailydata
node_dailyui -->|"receives load data"| node_page
node_dailyui -->|"initializes data"| node_state
node_dailyui -->|"renders game"| node_board
node_dailyui -->|"renders"| node_timer
node_dailyui -->|"renders"| node_emoji
node_dailyui -->|"renders"| node_number
node_dailyui -->|"renders"| node_count
node_dailyui -->|"renders"| node_yesterday
node_dailyui -->|"renders"| node_title
node_dailyui -->|"renders"| node_about
node_dailyui -->|"renders"| node_discord
node_dailyui -->|"renders"| node_github
node_player -->|"plays"| node_board
node_board -->|"updates guesses"| node_state
node_board -->|"handles input"| node_keyboard
node_keyboard -->|"dispatches keys"| node_board
node_board -->|"validates against dictionary"| node_state
node_board -->|"renders guesses"| node_rows
node_board -->|"renders control"| node_hint
node_board -->|"renders control"| node_giveup
node_board -->|"renders overlay"| node_start
node_board -->|"renders alert"| node_invalid
node_board -->|"renders outcome"| node_result
node_board -->|"loads and saves progress"| node_storage
node_result -->|"shares results"| node_share
node_player -.->|"plays published game"| node_staticdeploy

click node_page "https://github.com/asbedb/scapedle/blob/main/src/routes/%2Bpage.server.ts"
click node_words "https://github.com/asbedb/scapedle/blob/main/src/lib/server/wordList.ts"
click node_dailydata "https://github.com/asbedb/scapedle/blob/main/src/lib/stores/gameState.svelte.ts"
click node_dailyui "https://github.com/asbedb/scapedle/blob/main/src/routes/%2Bpage.svelte"
click node_state "https://github.com/asbedb/scapedle/blob/main/src/lib/stores/gameState.svelte.ts"
click node_board "https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameBoard.svelte"
click node_rows "https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameRows.svelte"
click node_keyboard "https://github.com/asbedb/scapedle/blob/main/src/lib/components/Keyboard.svelte"
click node_hint "https://github.com/asbedb/scapedle/blob/main/src/lib/components/HintButton.svelte"
click node_giveup "https://github.com/asbedb/scapedle/blob/main/src/lib/components/GiveUpButton.svelte"
click node_result "https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameOverModal.svelte"
click node_invalid "https://github.com/asbedb/scapedle/blob/main/src/lib/components/InvalidWordAlert.svelte"
click node_start "https://github.com/asbedb/scapedle/blob/main/src/lib/components/StartOverlay.svelte"
click node_timer "https://github.com/asbedb/scapedle/blob/main/src/lib/components/Timer.svelte"
click node_emoji "https://github.com/asbedb/scapedle/blob/main/src/lib/components/EmojiHint.svelte"
click node_number "https://github.com/asbedb/scapedle/blob/main/src/lib/components/WordNumber.svelte"
click node_count "https://github.com/asbedb/scapedle/blob/main/src/lib/components/WordCount.svelte"
click node_yesterday "https://github.com/asbedb/scapedle/blob/main/src/lib/components/YesterdaysWord.svelte"
click node_title "https://github.com/asbedb/scapedle/blob/main/src/lib/components/SiteTitle.svelte"
click node_about "https://github.com/asbedb/scapedle/blob/main/src/lib/components/AboutEmbed.svelte"
click node_discord "https://github.com/asbedb/scapedle/blob/main/src/lib/components/DiscordEmbed.svelte"
click node_github "https://github.com/asbedb/scapedle/blob/main/src/lib/components/GitHubEmbed.svelte"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_page,node_words,node_dailydata toneBlue
class node_state,node_board,node_rows,node_keyboard,node_hint,node_giveup,node_result,node_invalid,node_start,node_storage toneAmber
class node_dailyui,node_timer,node_emoji,node_number,node_count,node_yesterday,node_title toneMint
class node_about,node_discord,node_github toneRose
class node_player,node_share,node_staticdeploy toneIndigo
```

## Components

### Daily puzzle

- [Daily load](https://github.com/asbedb/scapedle/blob/main/src/routes/%2Bpage.server.ts): `src/routes/+page.server.ts`
- [OSRS wordlist](https://github.com/asbedb/scapedle/blob/main/src/lib/server/wordList.ts): `src/lib/server/wordList.ts`
- [Puzzle data](https://github.com/asbedb/scapedle/blob/main/src/lib/stores/gameState.svelte.ts): `src/lib/stores/gameState.svelte.ts`

### Gameplay

- [Game state](https://github.com/asbedb/scapedle/blob/main/src/lib/stores/gameState.svelte.ts): `src/lib/stores/gameState.svelte.ts`
- [Game board](https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameBoard.svelte): `src/lib/components/GameBoard.svelte`
- [Guess rows](https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameRows.svelte): `src/lib/components/GameRows.svelte`
- [Keyboard input](https://github.com/asbedb/scapedle/blob/main/src/lib/components/Keyboard.svelte): `src/lib/components/Keyboard.svelte`
- [Hint control](https://github.com/asbedb/scapedle/blob/main/src/lib/components/HintButton.svelte): `src/lib/components/HintButton.svelte`
- [Give up](https://github.com/asbedb/scapedle/blob/main/src/lib/components/GiveUpButton.svelte): `src/lib/components/GiveUpButton.svelte`
- [Game result](https://github.com/asbedb/scapedle/blob/main/src/lib/components/GameOverModal.svelte): `src/lib/components/GameOverModal.svelte`
- [Invalid guess](https://github.com/asbedb/scapedle/blob/main/src/lib/components/InvalidWordAlert.svelte): `src/lib/components/InvalidWordAlert.svelte`
- [Start overlay](https://github.com/asbedb/scapedle/blob/main/src/lib/components/StartOverlay.svelte): `src/lib/components/StartOverlay.svelte`

### Game interface

- [Game page](https://github.com/asbedb/scapedle/blob/main/src/routes/%2Bpage.svelte): `src/routes/+page.svelte`
- [Daily timer](https://github.com/asbedb/scapedle/blob/main/src/lib/components/Timer.svelte): `src/lib/components/Timer.svelte`
- [Emoji hints](https://github.com/asbedb/scapedle/blob/main/src/lib/components/EmojiHint.svelte): `src/lib/components/EmojiHint.svelte`
- [Puzzle number](https://github.com/asbedb/scapedle/blob/main/src/lib/components/WordNumber.svelte): `src/lib/components/WordNumber.svelte`
- [Dictionary count](https://github.com/asbedb/scapedle/blob/main/src/lib/components/WordCount.svelte): `src/lib/components/WordCount.svelte`
- [Yesterday's word](https://github.com/asbedb/scapedle/blob/main/src/lib/components/YesterdaysWord.svelte): `src/lib/components/YesterdaysWord.svelte`
- [Site title](https://github.com/asbedb/scapedle/blob/main/src/lib/components/SiteTitle.svelte): `src/lib/components/SiteTitle.svelte`

### Community information

- [About embed](https://github.com/asbedb/scapedle/blob/main/src/lib/components/AboutEmbed.svelte): `src/lib/components/AboutEmbed.svelte`
- [Discord link](https://github.com/asbedb/scapedle/blob/main/src/lib/components/DiscordEmbed.svelte): `src/lib/components/DiscordEmbed.svelte`
- [GitHub link](https://github.com/asbedb/scapedle/blob/main/src/lib/components/GitHubEmbed.svelte): `src/lib/components/GitHubEmbed.svelte`

### Other components

- **Player**
- **Browser storage**
- **Share target**
- **Static hosting**

## Connections

- Daily load → OSRS wordlist: reads items
- Daily load → Puzzle data: returns puzzle data
- Game page → Daily load: receives load data
- Game page → Game state: initializes data
- Game page → Game board: renders game
- Game page → Daily timer: renders
- Game page → Emoji hints: renders
- Game page → Puzzle number: renders
- Game page → Dictionary count: renders
- Game page → Yesterday's word: renders
- Game page → Site title: renders
- Game page → About embed: renders
- Game page → Discord link: renders
- Game page → GitHub link: renders
- Player → Game board: plays
- Game board → Game state: updates guesses
- Game board → Keyboard input: handles input
- Keyboard input → Game board: dispatches keys
- Game board → Game state: validates against dictionary
- Game board → Guess rows: renders guesses
- Game board → Hint control: renders control
- Game board → Give up: renders control
- Game board → Start overlay: renders overlay
- Game board → Invalid guess: renders alert
- Game board → Game result: renders outcome
- Game board → Browser storage: loads and saves progress
- Game result → Share target: shares results
- Player → Static hosting: plays published game
