Docs

Wordly

Install and make Wordly yours, the word game in SwiftUI + Metal. Version 1.0.0.

A daily word game set in glazed tiles: shape a row of bisque, fire it, and the glazes tell you how close you came. This guide takes you from download to a running game under your own name. It covers version 1.0.0. See the screens on its game page.

Requirements

  • Xcode 26 and an iOS 18.0 or later deployment target
  • Tuist 4 (brew install tuist)
  • An Apple Developer team for devices, Game Center, iCloud and the widget. The simulator runs without one.

Install

Download

Included with SwiftPieces Games. Not signed in? The button takes you to sign in or create an account, then starts the download when you're back. Unzip the archive; it contains one folder, Wordly/.

Make it yours

cd Wordly
scripts/setup.sh --name YourGame --bundle-id com.you.yourgame --preset herbarium

The script renames the target, scheme and bundle ids, rewrites the StoreKit product ids, sets the starting preset and runs tuist generate. To keep the name Wordly for now, run tuist generate instead.

Run it

Open YourGame.xcworkspace, choose an iPhone simulator and run the YourGame scheme. The scheme uses Configuration/Products.storekit, so the shop works before App Store Connect is set up.

What's in the project

  • Content: Endless, with a tuned curve
  • Game Center: 2 leaderboards, 12 achievements
  • Shop: Wordly Plus (the archive and four extra styles), Hint packs, Tip jar
  • Built on: GameCore, Feel, Economy, GameServices, Shaders, Motion, GameUI
  • Presets: glaze, herbarium, broadsheet
  • Swift: 6,733 lines in 68 files

What's inside

FolderWhat
Modules/GameCoreGame-agnostic engine pieces: SplitMix64, the event ring buffer, a fixed-step clock, the day clock and a Rive-style state machine kit (inputs, interruptible eased transitions, pose layers, 1D and additive blends, weighted idle decks).
Modules/WordlyKitThe game, in plain Swift: lexicon, almanac (the daily order), PressWorld (the simulation, emitting PressEvents), scoring, the record, saves, the hint wallet, the archive, Game Center goals, share text, products, the widget snapshot.
Modules/WordlyDesignGameTheme tokens for five styles, Glaze's three clays and two glaze sets (all audited for contrast in tests), the keycap, button and card kit, the glaze shaders and the bundled fonts.
Modules/PressFeelThe juice layer: JuiceDirector turns sim events into timed beats, the studio foley synthesizer, AVAudioEngine voices and Core Haptics patterns.
Modules/GameServicesGame-agnostic Game Center, iCloud key-value mirror and StoreKit 2 storefront.
Modules/WordlyUIEvery screen: the front page, the play screen (board, keyboard, Fired stamp, glaze drops, results card), panels, the root router and the performance tiers.
App, WidgetThe app entry and service wiring; the Home and Lock Screen widget.
Design/StyleSpec.mdThe art direction: tone, shape, palette roles, value plan, light, material, background, type, motion, sound, do and don't, the approved controls, and a section per style.

Styles

Five looks share one codebase: Glaze (the ceramics studio, with Bisque, Terracotta and Kiln Night clays), Herbarium (a pressed-specimen sheet), Broadsheet (a Swiss newspaper page), Jelly (glossy candy) and Woodshop (wooden tiles on green felt). Players switch in Settings › Style. The preset style is free and the others come with Wordly Plus, so a locked style shows a lock and opens the shop. Design/StyleSpec.md describes each one.

How a row gets fired

  1. A key calls ProofController.type, which tells PressWorld. The world validates, mutates and pushes PressEvents into its ring buffer. It never imports SwiftUI.
  2. JuiceDirector.beats(for:) turns each event into beats on a timeline: the firing per tile 0.24 s apart, the glaze pour with a clink and a haptic, the keyboard update, the stamp and glaze drops.
  3. The play screen's TimelineView runs only while beats are pending and applies them to low-frequency tile state. SwiftUI never sees a per-frame value from the sim, and everything settles when idle.
  4. After each fired row the session checkpoints the save (on device, then iCloud) and, when the day is done, reports Game Center progress and refreshes the widget.

Rebrand options

  • Look: setup.sh --preset STYLE picks the default style and renders its icon (scripts/render-icon.py). GlazePalette.make(style:clay:glazes:) holds every colour and WordlyStyle the fonts and build traits; GameTheme.wordly maps them to roles. The tests audit every style and glaze set for contrast, so add or change a style there and run them.
  • Words: edit scripts/wordlists/blocklist.txt and run scripts/build-wordlists.py.
  • Economy: see BALANCE.md. Product ids follow the prefix from setup.sh (PressProducts).
  • Game Center: GAMECENTER.md lists every id to create.

Tests

WordlyTests covers the sim, scoring, hard mode, the schedule, saves and merges, the wallet, the juice timeline, the state machines, the synthesizer and the contrast audit. The pure modules also build on Linux with SwiftPM, which is how they were developed.

Accessibility

Marks carry a shape as well as a colour in every style (Glaze: a diamond, a ring, bare matte clay; the others: see the StyleSpec); colour-safe glazes follow Differentiate Without Color. Reduce Motion swaps travel for fades, drops the shake and glaze drops, and freezes the dust. Increase Contrast darkens muted text and halves grain and sheen. The board, keys, stamp and results have VoiceOver labels, and refusals are announced.

Changelog

1.0.0

2026-10-30

  • Rebuilt from a fresh slate as a glazed ceramics studio: every letter is a bisque tile you set on a plaster wall, and firing the row glazes it cobalt, saffron or leaves it bare terracotta.
  • A daily five-letter puzzle, the same for every player, from 1,891 curated answers in a seeded order that never puts two tricky words on consecutive days. 6,504 words are accepted.
  • The firing: tiles turn, glaze pours across from the centre and a sheen sweeps over it, 0.24 s apart, each with a ceramic clink climbing a pentatonic scale and a matching haptic.
  • Marks that never rely on colour: a diamond on right-place tiles, a ring on in-the-word tiles, bare matte clay for the rest. Colour-safe glazes (deeper cobalt, brighter saffron) in settings and with Differentiate Without Color.
  • Bisque keycap keyboard with a cobalt glazed return key and a dark terracotta delete key, laid out so every row shares its edges.
  • Smudge, a terracotta drop in a dripping cobalt glaze cap, drawn in Canvas and driven by layered, interruptible state machines with blended poses, weighted idle variations and reactions to every line.
  • Fired and Unfired stamps, a burst of glaze drops on a win, and a results card with the glazed marks grid and share text.
  • Hints: reveal one letter in place. 1 a day free, 3 with Plus, more at streak milestones.
  • The archive (the last 7 days free, every day with Wordly Plus), your record with the rows-to-solve distribution, and hard mode.
  • Game Center: 12 achievements and 2 leaderboards, the access point hidden during play.
  • Young Serif and Figtree type, three clays (Bisque, Terracotta, Kiln Night), Reduce Motion and Increase Contrast variants, VoiceOver labels on the board, keys and results.
  • Saved after every row and mirrored through iCloud; a Home and Lock Screen widget that turns over at midnight and never shows the word.
  • Wordly Plus, hint packs and a tip jar on StoreKit 2. Synthesized foley, no audio files. 120 Hz, Game Mode, thermal and Low Power tiers.