Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ members = [
"examples/sidekick",
"examples/store",
"apps/arxiv",
"apps/lexicube",
"apps/morse",
"apps/sudoku",
"tools/icon-import",
Expand Down
39 changes: 25 additions & 14 deletions apps/catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"display_name": "arXiv",
"short_label": "arXiv",
"summary": "Browse and search arXiv, keep preprints, and read their HTML versions on your Kobo.",
"version": "1.3.4",
"version": "1.3.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "note",
"capabilities": ["network"]
Expand All @@ -18,7 +18,7 @@
"display_name": "Audiobook Studio",
"short_label": "Audiobooks",
"summary": "Turn a topic into an original narrated audiobook and listen on your Kobo.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "headphones",
"capabilities": ["network", "audio", "bluetooth-audio", "bluetooth-control"]
Expand All @@ -29,7 +29,7 @@
"display_name": "Daily Brief",
"short_label": "Daily Brief",
"summary": "Build a daily news brief in the background while you use other apps.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "clock",
"capabilities": ["network"]
Expand All @@ -40,7 +40,7 @@
"display_name": "AI Command Center",
"short_label": "AI Chat",
"summary": "Ask a question, then read and navigate the answer with touch controls.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "chat",
"capabilities": ["network"]
Expand All @@ -51,7 +51,7 @@
"display_name": "Components",
"short_label": "Components",
"summary": "See every Cobalt UI component on the device in one reference app.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "chart",
"capabilities": ["network"]
Expand All @@ -62,7 +62,7 @@
"display_name": "Gutenbird",
"short_label": "Gutenbird",
"summary": "Browse OPDS libraries and read their books on your Kobo.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "book",
"capabilities": ["network", "frontlight-control"]
Expand All @@ -73,18 +73,29 @@
"display_name": "Hacker News",
"short_label": "Hacker News",
"summary": "Read Top, New, Ask, and Show stories with complete comment threads.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "news",
"capabilities": ["network"]
},
{
"package": "kobo-lexicube",
"id": "lexicube",
"display_name": "Lexicube",
"short_label": "Lexicube",
"summary": "Shake sixteen letter dice, find words for three minutes, then look them up.",
"version": "1.0.0",
"minimum_cobalt_version": "0.3.1",
"glyph": "grid",
"capabilities": []
},
{
"package": "kobo-magnet",
"id": "magnet",
"display_name": "Magnet",
"short_label": "Magnet",
"summary": "Find the hall sensor behind the bezel and watch it respond to a magnet.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "magnet",
"capabilities": ["cover-sensor"]
Expand All @@ -95,7 +106,7 @@
"display_name": "Morse",
"short_label": "Morse",
"summary": "Type a message and send it in Morse code with the front light.",
"version": "1.0.6",
"version": "1.0.7",
"minimum_cobalt_version": "0.3.1",
"glyph": "light",
"capabilities": ["frontlight-control", "keep-awake"]
Expand All @@ -106,7 +117,7 @@
"display_name": "Feeds",
"short_label": "Feeds",
"summary": "Follow website feeds and read their articles without the web page around them.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "rss",
"capabilities": ["network"]
Expand All @@ -117,7 +128,7 @@
"display_name": "Sidekick",
"short_label": "Sidekick",
"summary": "Answer coding-agent permission prompts from your Kobo.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "key",
"capabilities": ["network"]
Expand All @@ -128,7 +139,7 @@
"display_name": "Sudoku",
"short_label": "Sudoku",
"summary": "Play touch-first Sudoku designed for an e-ink screen.",
"version": "1.0.5",
"version": "1.0.6",
"minimum_cobalt_version": "0.3.1",
"glyph": "grid",
"capabilities": []
Expand All @@ -139,7 +150,7 @@
"display_name": "Tic-tac-toe",
"short_label": "Tic-tac-toe",
"summary": "Play tic-tac-toe together on one Kobo.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "grid",
"capabilities": []
Expand All @@ -150,7 +161,7 @@
"display_name": "Todo",
"short_label": "Todo",
"summary": "Keep a simple to-do list that stays on your Kobo.",
"version": "1.0.4",
"version": "1.0.5",
"minimum_cobalt_version": "0.3.1",
"glyph": "check",
"capabilities": []
Expand Down
18 changes: 18 additions & 0 deletions apps/lexicube/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[package]
name = "kobo-lexicube"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
publish = false

[dependencies]
fontdue = "0.9"
kobo-sdk = { path = "../../crates/kobo-sdk" }
kobo-text = { path = "../../crates/kobo-text" }

[dev-dependencies]
kobo-ui = { path = "../../crates/kobo-ui" }

[lints]
workspace = true
50 changes: 50 additions & 0 deletions apps/lexicube/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Lexicube

Sixteen letter dice, three minutes, and a dictionary for the argument
afterwards.

The board is the game: players read the same shaken board and write every word
they can find on their own paper, exactly as they would around a physical
tray. The app supplies the shake, the clock, and the part every table wants
when the pens go down — settling whether a word is real.

| Mid-game | Checking a word |
| --- | --- |
| ![Sixteen serif letter dice lying rotated on a 4x4 board under a countdown clock](screenshots/board.png) | ![A checked word marked valid, with two offline WordNet definitions above the keyboard](screenshots/lookup.png) |

*Captured from a Kobo Libra Colour with `kobo shot --device`.*

## Playing

Shake with **New game**. The dice land rotated, as plastic dice do, drawn in a
bold serif whose serifs keep a turned N from reading as a Z. A word uses
letters that touch in a chain, sideways or diagonally, without using the same
die twice; three letters or longer, and the Qu die counts as two letters.

**Pause** covers the board with a letterless twin of the same size, so
stopping the clock never hands anybody extra thinking time. **End the game
early** sits under the clock for tables that run out of words before the
clock does.

## When the pens go down

**Check a word** settles disputes: validity is answered offline from an
embedded ENABLE list of 172,820 words, misspellings get near-miss
suggestions, and definitions come from Cobalt's offline dictionary service
when the owner has installed dictionaries. Scoring is a word's letter count
minus two — one point for a three-letter word, and one more for every letter
beyond it. A plural is its own word, found and scored beside its singular.

## Licences

The word list is ENABLE (Enhanced North American Benchmark LExicon), the
public-domain word-game list compiled by Alan Beale and M. Cooper, as
mirrored at [norvig.com/ngrams/enable1.txt](https://norvig.com/ngrams/enable1.txt).
The dice letters are set in DejaVu Serif Bold, whose Bitstream Vera licence
travels beside it in `fonts/LICENSE-DejaVu.txt`. The dice face distribution
is the modern tabletop set's.

---

Built with the [Cobalt SDK](../../README.md). No capabilities: the panel and
the embedded list are the whole game.
Binary file added apps/lexicube/fonts/DejaVuSerif-Bold.ttf
Binary file not shown.
Loading
Loading