diff --git a/.gitignore b/.gitignore index 0c7a71b..3b2252f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ -# Full-resolution & print-bleed art — kept local (too big for git; add via Git LFS later) -cards/art/ +# PNG masters and print-bleed fronts stay local — the committed archive of every +# card is cards/art/*.jpg (q95, 4:4:4), which the tools fall back to when the +# .png master is absent. A fresh clone can rebuild print/fronts from the JPEGs. +cards/art/*.png print/fronts/ # Ephemera server.log @@ -9,3 +11,6 @@ __pycache__/ .DS_Store app/models/ app/state/ + +# Local style tests / generation scratch +.scratch/ diff --git a/app/oracle/deck.py b/app/oracle/deck.py index 7abdb2e..0bc104a 100644 --- a/app/oracle/deck.py +++ b/app/oracle/deck.py @@ -1,12 +1,36 @@ """Load the deck and model the Tree spread.""" import json import os +import random import time REPO = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) CARDS_PATH = os.path.join(REPO, "data", "cards.json") SPREAD_REALMS = ("roots", "trunk", "branches") + +# The Tree spread pulls Root / Trunk / Branch. The twelve Shell cards are the axis itself, +# and cards.json has always promised they "can substitute into any position" — but nothing +# ever implemented it, so a quarter of the printed deck (including The World Turtle, the +# camp's own mascot) could never appear in a reading. +# +# One slot per spread may become a Shell card, at most, so it stays an event rather than a +# flavour. At 1-in-10 a busy night sees a handful — often enough that the turtles witness +# it, rare enough that it means something when it lands. +SHELL_CHANCE = float(os.environ.get("ORACLE_SHELL_CHANCE", "0.10")) + + +def draw_spread(by_realm, rng=random): + """Pure chance, one card per slot. Returns (picks, axis_slot|None). + + axis_slot names the slot the Turtle's own axis spoke into, if any. + """ + picks = {slot: rng.choice(by_realm[slot]) for slot in SPREAD_REALMS} + axis_slot = None + if by_realm.get("shell") and rng.random() < SHELL_CHANCE: + axis_slot = rng.choice(SPREAD_REALMS) + picks[axis_slot] = rng.choice(by_realm["shell"]) + return picks, axis_slot SLOT_LABEL = { "roots": "what to face", "trunk": "where you stand", diff --git a/app/oracle/llm.py b/app/oracle/llm.py index bbc3e6c..44a1c67 100644 --- a/app/oracle/llm.py +++ b/app/oracle/llm.py @@ -1,22 +1,40 @@ """Local LLM adapter (Ollama over stdlib urllib). Any failure -> None, so callers fall back.""" import json import os +import time import urllib.request +# Models that emit a preamble unless told not to. The Turtle has no use for one. +NO_THINK = ("qwen3", "deepseek", "gpt-oss", "magistral") + +# How long a probe result is trusted. Short enough that Ollama coming up late (a power blip +# on playa reorders systemd units) heals on its own within a seeker or two; long enough that +# we don't probe on every LLM touch. +PROBE_TTL = float(os.environ.get("ORACLE_PROBE_TTL", "30")) + class LLM: def __init__(self, model=None, host=None): self.model = model or os.environ.get("ORACLE_MODEL", "qwen2.5") self.host = (host or os.environ.get("OLLAMA_HOST", "http://localhost:11434")).rstrip("/") self._available = None + self._probed_at = 0.0 def available(self): - if self._available is None: + """Probe Ollama, re-probing after PROBE_TTL. + + Never cache the answer for the life of the process: if Ollama is down when the + oracle starts and comes up later, a permanently-cached False leaves the Turtle in + template mode until a human restarts it — and on playa nobody is at a keyboard. + """ + now = time.monotonic() + if self._available is None or (now - self._probed_at) > PROBE_TTL: try: with urllib.request.urlopen(self.host + "/api/tags", timeout=1.5) as r: self._available = r.status == 200 except Exception: self._available = False + self._probed_at = now return self._available def generate(self, prompt, system=None, timeout=90, as_json=False): @@ -27,7 +45,7 @@ def generate(self, prompt, system=None, timeout=90, as_json=False): "options": {"temperature": 0.75}, "keep_alive": -1, # stay resident: no 20s reload between seekers } - if self.model.startswith(("qwen3", "deepseek")): + if self.model.startswith(NO_THINK): body["think"] = False if system: body["system"] = system diff --git a/app/oracle/printer.py b/app/oracle/printer.py index abd38fd..c4c5c94 100644 --- a/app/oracle/printer.py +++ b/app/oracle/printer.py @@ -1,8 +1,14 @@ -"""Thermal receipt: format the reading + quest for a 58mm ESC/POS printer. +"""Thermal receipt: format the reading + quest for an ESC/POS printer. -Prints to a USB ESC/POS printer if python-escpos is installed and ESCPOS_VENDOR_ID / -ESCPOS_PRODUCT_ID are set; otherwise saves a text preview to app/receipts/ so you can see -exactly what would print. 58mm printers are ~32 characters wide. +The camp runs Epson TM-m30III units: 80mm paper, 48 columns in font A. Set +ORACLE_PRINT_WIDTH to 32 for a 58mm printer. + +Transport, in order of preference: + ESCPOS_HOST -> network printer on port 9100 (the TM-m30III's ethernet port; + one cable to the camp router, nothing to kick loose) + ESCPOS_VENDOR_ID/_PRODUCT_ID -> USB + neither -> save a text preview to app/receipts/ so you can see exactly + what would have printed """ import os import textwrap @@ -11,7 +17,9 @@ from .deck import REPO from .geo import COMPASS_ROSE, directions_lines -WIDTH = 32 +# 80mm / font A = 48 cols on the TM-m30III; 58mm printers are 32. +WIDTH = int(os.environ.get("ORACLE_PRINT_WIDTH", "48")) +PROFILE = os.environ.get("ESCPOS_PROFILE", "TM-m30") RECEIPTS = os.path.join(REPO, "app", "receipts") @@ -27,6 +35,17 @@ def _wrap(s): return textwrap.wrap(s, WIDTH) or [""] +def _center_block(block): + """Centre a fixed-width ASCII block (the compass rose) inside WIDTH. + + The rose is hand-drawn at <=32 cols; on 80mm paper it would otherwise hug the + left edge while everything around it fills the width. + """ + lines = block.split("\n") + pad = max(0, (WIDTH - max(len(l) for l in lines)) // 2) + return "\n".join(" " * pad + l for l in lines) + + def format_receipt(payload, picks, located, quest=None): L = [] L.append(_center("* THE TERRIBLE TURTLE *")) @@ -43,7 +62,10 @@ def format_receipt(payload, picks, located, quest=None): labels = {"roots": "FACE", "trunk": "STAND", "branches": "REACH"} for realm in ("roots", "trunk", "branches"): c = picks[realm] - L.extend(_wrap(f"[{labels[realm]}] {c['name']}")) + # a Shell card standing in a Tree slot is the axis; say so on the paper too, so + # the seeker still has the evidence of it days later + label = "* AXIS *" if c.get("realm") == "shell" else labels[realm] + L.extend(_wrap(f"[{label}] {c['name']}")) L.append(_rule()) L.append("") L.append("THE READING") @@ -78,7 +100,7 @@ def format_receipt(payload, picks, located, quest=None): L.append("") L.append(_rule()) L.append("WHERE TO GO") - L.append(COMPASS_ROSE) + L.append(_center_block(COMPASS_ROSE)) L.append("") for line in directions_lines(picks, located): for w in _wrap("> " + line): @@ -91,14 +113,30 @@ def format_receipt(payload, picks, located, quest=None): return "\n".join(L) -def print_or_preview(text): - """Try the USB printer; fall back to saving a preview file. Returns a status dict.""" +def print_or_preview(text, host=None): + """Print to the network or USB printer; fall back to a preview file. Returns a status dict. + + host overrides ESCPOS_HOST so a station can be bound to its own printer. + """ + host = host or os.environ.get("ESCPOS_HOST") vid = os.environ.get("ESCPOS_VENDOR_ID") pid = os.environ.get("ESCPOS_PRODUCT_ID") + if host: + try: + from escpos.printer import Network # requires: pip install python-escpos + p = Network(host, port=int(os.environ.get("ESCPOS_PORT", "9100")), + timeout=10, profile=PROFILE) + p.text(text + "\n") + p.cut() + p.close() + return {"status": "printed", "target": f"net {host}"} + except Exception as e: # noqa: BLE001 + preview = _save_preview(text) + return {"status": "preview", "path": preview, "error": f"printer error: {e}"} if vid and pid: try: from escpos.printer import Usb # requires: pip install python-escpos pyusb - p = Usb(int(vid, 16), int(pid, 16), profile="TM-T88III") + p = Usb(int(vid, 16), int(pid, 16), profile=PROFILE) p.text(text + "\n") p.cut() return {"status": "printed", "target": f"usb {vid}:{pid}"} @@ -107,7 +145,8 @@ def print_or_preview(text): return {"status": "preview", "path": preview, "error": f"printer error: {e}"} preview = _save_preview(text) return {"status": "preview", "path": preview, - "note": "No ESCPOS_VENDOR_ID/PRODUCT_ID set — saved a preview instead of printing."} + "note": "No ESCPOS_HOST or ESCPOS_VENDOR_ID/PRODUCT_ID set — saved a preview " + "instead of printing."} def _save_preview(text): diff --git a/app/oracle/server.py b/app/oracle/server.py index 578f4ef..0893875 100644 --- a/app/oracle/server.py +++ b/app/oracle/server.py @@ -27,7 +27,30 @@ LLM_SINGLETON = LLM() ART_RE = re.compile(r"^(shell|roots|trunk|branches)-\d{2}\.png$") WEBIMG_RE = re.compile(r"^((shell|roots|trunk|branches)-\d{2}|back)\.jpg$") -LAST = {} # last built reading (kiosk = one seeker at a time), for /api/print + +# Legacy single-question flow (/api/reading, app/web/index.html) only. The séance +# (/api/session/*) never touches this — its state is per-session, because two tablets +# plus phones on the camp network mean several seekers are mid-reading at once and a +# shared "last reading" prints one person's quest for another. +LAST = {} +LAST_LOCK = threading.Lock() + +# Per-station printer binding: ESCPOS_HOST_1 / _2 pick a printer for kiosk=1 / kiosk=2. +def _printer_host(kiosk): + return os.environ.get(f"ESCPOS_HOST_{kiosk}") if kiosk else None + + +# The fallback weave is good enough that a dead model reads as a working oracle — the +# séance completes, the reading is real, nobody notices. On playa that could go a whole +# night. Count which tier actually served each reading so a camp turtle can check. +TIERS = {"llm": 0, "fallback": 0} +TIERS_LOCK = threading.Lock() + + +def note_tier(mode): + with TIERS_LOCK: + if mode in TIERS: + TIERS[mode] += 1 def build_reading(question): @@ -44,11 +67,27 @@ def build_reading(question): "directions": directions_lines(picks, located), "modes": {"select": sel_mode, "weave": weave_mode}, } - LAST.clear() - LAST.update({"payload": payload, "picks": picks, "located": located}) + with LAST_LOCK: + LAST.clear() + LAST.update({"payload": payload, "picks": picks, "located": located}) return payload +def receipt_for_session(sid): + """Format the receipt for one séance, from that séance's own state.""" + sess = session.snapshot(sid) + if not sess: + return None + payload = { + "question": " / ".join(sess["shares"]), + "reading": sess["reading"], + "adventure": sess["adventure"], + "name": sess.get("name"), + } + return printer.format_receipt(payload, sess["picks"], sess["located"], + quest=sess.get("quest")) + + REALM_ORDER = {"shell": 0, "roots": 1, "trunk": 2, "branches": 3} @@ -122,6 +161,23 @@ def do_GET(self): return self._send(200, all_cards_payload()) if path == "/api/lore": return self._send(200, lore.counts()) + if path == "/api/health": + with TIERS_LOCK: + tiers = dict(TIERS) + total = tiers["llm"] + tiers["fallback"] + return self._send(200, { + "llm_reachable": LLM_SINGLETON.available(), + "model": LLM_SINGLETON.model, + "ears": ears.available(), + "readings": tiers, + # the number to look at: if this is climbing, the Turtle has gone dumb + # and is hiding it behind a very convincing template + "fallback_pct": round(100.0 * tiers["fallback"] / total, 1) if total else None, + "live_seances": len(session.SESSIONS), + "printer": ("network" if os.environ.get("ESCPOS_HOST") or + os.environ.get("ESCPOS_HOST_1") + else "usb" if os.environ.get("ESCPOS_VENDOR_ID") else "preview-only"), + }) if path.startswith("/thumb/") or path.startswith("/med/"): sub = "thumb" if path.startswith("/thumb/") else "med" name = os.path.basename(path) @@ -162,11 +218,24 @@ def do_POST(self): except Exception as e: return self._send(500, {"error": str(e)}) if path == "/api/print": - if not LAST: - return self._send(400, {"error": "no reading to print yet"}) - text = printer.format_receipt(LAST["payload"], LAST["picks"], LAST["located"], - quest=LAST.get("quest")) - result = printer.print_or_preview(text) + try: + body = json.loads(raw or b"{}") + except Exception: + body = {} + sid = (body.get("session") or "").strip() + if sid: + text = receipt_for_session(sid) + if text is None: + return self._send(400, {"error": "no such séance to print"}) + else: + # legacy /api/reading flow + with LAST_LOCK: + if not LAST: + return self._send(400, {"error": "no reading to print yet"}) + snap = dict(LAST) + text = printer.format_receipt(snap["payload"], snap["picks"], snap["located"], + quest=snap.get("quest")) + result = printer.print_or_preview(text, host=_printer_host(body.get("kiosk"))) result["receipt"] = text return self._send(200, result) if path == "/api/transcribe": @@ -191,22 +260,13 @@ def do_POST(self): return self._send(200, session.start(mode)) sid = (body.get("session") or "").strip() if action == "say": - return self._send(200, session.hear(sid, body, LLM_SINGLETON)) - if action == "accept": - event = session.accept(sid, LLM_SINGLETON) - sess = session.snapshot(sid) - if sess and sess.get("quest"): - # stage the sealed quest for /api/print - told = " / ".join(sess["shares"]) - LAST.clear() - LAST.update({ - "payload": {"question": told, "reading": sess["reading"], - "adventure": sess["adventure"], - "name": sess.get("name")}, - "picks": sess["picks"], "located": sess["located"], - "quest": sess["quest"], - }) + event = session.hear(sid, body, LLM_SINGLETON) + note_tier((event.get("modes") or {}).get("weave")) return self._send(200, event) + if action == "accept": + # The sealed quest stays on the session; /api/print reads it back by + # session id. Nothing is staged in shared state. + return self._send(200, session.accept(sid, LLM_SINGLETON)) except Exception as e: return self._send(500, {"error": str(e)}) return self._send(404, {"error": "unknown séance action"}) diff --git a/app/oracle/session.py b/app/oracle/session.py index 48ec528..cfec8db 100644 --- a/app/oracle/session.py +++ b/app/oracle/session.py @@ -17,7 +17,7 @@ import os -from .deck import load_deck, card_payload, REPO +from .deck import load_deck, card_payload, draw_spread, REPO from .select import select_fallback, _tokens from .weave import weave, SYSTEM, card_lore from .geo import locate_spread, directions_lines, COMPASS_ROSE @@ -29,7 +29,20 @@ WEATHER_ASK = WEATHER["meta"]["ask"] SESSIONS = {} -MAX_SESSIONS = 60 # kiosk = one seeker at a time; keep a small tail for stragglers +MAX_SESSIONS = 200 # two stations plus phones on the camp network: many séances at once + +# LLM patience, set from measurement on the DGX Spark (qwen3:30b-a3b, 2026-08-07). +# +# 1 seeker, warm: full séance 10.5s (weave+echoes 5.7, refine 2.1, seal 2.7) +# 6 seekers, warm: slowest single call 24.4s, whole séance ~57s wall +# +# Ollama serialises on one GPU, so per-call latency scales with how many seekers are +# mid-séance. 25s looked generous against the solo number and would have tripped at a +# busy moment — the worst possible time, because that is when the most people are +# watching. These are guards against a genuinely hung model, not pacing controls: the +# fallback is a VISIBLE drop in quality, so let the model win whenever it is merely slow. +T_SHORT = float(os.environ.get("ORACLE_T_SHORT", "45")) # one-liners: follow-up, echoes +T_LONG = float(os.environ.get("ORACLE_T_LONG", "60")) # structured: refine, seal NAME_ASKS = [ "Ah. A traveler. Come closer — the shell is warm. First things first: what do they call you out here?", @@ -52,6 +65,12 @@ "Good. That is enough truth to pull on. The Tree is choosing your three.", ] +# Spoken instead of the usual line when a Shell card substitutes into a slot — roughly +# one séance in ten. The Turtle interrupting its own format is the whole point. +AXIS_LINE = ("The shell goes quiet. Mm. That is not a card from the Tree — that is the " + "Tree's own spine. “{card}” has come up for you, and the Turtle does not " + "choose when that happens. Sit with it.") + REFINE_ACKS = [ "Mm. That changes the shape of it. The Tree bends — hear your quest again.", "Good. More truth makes a better quest. Listen.", @@ -200,6 +219,12 @@ def _context(sess): c = _company(sess["shares"]) if c: parts.append(c) + if sess.get("axis_slot"): + parts.append("THE AXIS HAS SPOKEN: one of the three is not a Tree card but a Shell " + "card — the World Turtle's own axis, which surfaces for roughly one " + "seeker in ten. Name that this is rare, once, without ceremony or " + "flattery, and let it carry more weight in the reading than the " + "other two.") if sess.get("prior_line"): parts.append(sess["prior_line"]) return " ".join(parts) @@ -233,6 +258,7 @@ def start(mode="seek"): "name": None, "prior_line": None, "shares": [], "weather": None, "stones": [], "ground": 0.0, "stem_tried": False, "picks": None, "located": None, "reading": None, "adventure": None, + "axis_slot": None, "quest": None, "echoes": None, "created": time.time(), } say = random.choice(TALE_NAME_ASKS if tale else NAME_ASKS) @@ -247,7 +273,7 @@ def _followup_llm(shares, llm): "specific to their words, inviting one level deeper. It must be a question. " "Return the question only, no quotes, no preamble." ) - return _clean_line(llm.generate(prompt, system=SYSTEM, timeout=45), max_words=32) + return _clean_line(llm.generate(prompt, system=SYSTEM, timeout=T_SHORT), max_words=32) def _echoes_llm(sess, llm): @@ -268,7 +294,7 @@ def _echoes_llm(sess, llm): "Example shape: You said 'yes to everyone' — and the tide kept none of it for you.\n" 'Return JSON only: {"roots": "...", "trunk": "...", "branches": "..."}' ) - resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=60) + resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=T_SHORT) if not resp: return None try: @@ -313,19 +339,24 @@ def _draw(sess, llm): not the choosing — meaning is made, not matched.""" _, _, by_realm = load_deck() told = " ".join(sess["shares"]) - picks = {realm: random.choice(by_realm[realm]) for realm in ("roots", "trunk", "branches")} + picks, axis_slot = draw_spread(by_realm) sel_mode = "playa" located = locate_spread(picks) - sess.update(picks=picks, located=located) + sess.update(picks=picks, located=located, axis_slot=axis_slot) out, weave_mode = weave(told, picks, llm, located, context=_context(sess)) echoes = (_echoes_llm(sess, llm) if llm and llm.available() else None) or _echoes_fallback(sess) sess.update(reading=out["reading"], adventure=out["adventure"], echoes=echoes, stage="proposed") + say = random.choice(DRAWN_LINES) + if axis_slot: + say = AXIS_LINE.format(card=picks[axis_slot]["name"]) return { "session": sess["id"], "stage": "proposed", - "say": random.choice(DRAWN_LINES), + "say": say, "cards": {r: card_payload(picks[r], located[r]) for r in ("roots", "trunk", "branches")}, "echoes": echoes, + # which slot, if any, the Turtle's own axis spoke into — the kiosk marks it + "axis_slot": axis_slot, "reading": out["reading"], "adventure": out["adventure"], "map": COMPASS_ROSE, "directions": directions_lines(picks, located), "ask": DECISION_ASK, "expects": "decision", @@ -355,7 +386,7 @@ def _refine_llm(sess, llm): "naming the new truth.\n" 'Return JSON only: {"say": "...", "adventure": "..."}' ) - resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=120) + resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=T_LONG) if not resp: return None try: @@ -373,6 +404,12 @@ def _refine_fallback(sess): _, _, by_realm = load_deck() told = " ".join(sess["shares"]) picks = select_fallback(told, by_realm) + # select_fallback only knows the three Tree realms, so a re-score would quietly swap + # out an axis card the seeker has already been shown. The Turtle does not take that + # back — once the spine has spoken, it stays on the table. + axis_slot = sess.get("axis_slot") + if axis_slot and sess.get("picks"): + picks[axis_slot] = sess["picks"][axis_slot] located = locate_spread(picks) out = weave(told, picks, None, located)[0] sess.update(picks=picks, located=located, reading=out["reading"]) @@ -423,7 +460,7 @@ def _tale_step(sess, text, llm): "In the Turtle's voice, honor the tale in TWO sentences (under 40 words): first name one " "specific detail from the tale itself, then address the human turtle who witnessed it, " "telling THEM to hand this seeker their gift. Return the lines only.", - system=SYSTEM, timeout=60), max_words=50) + system=SYSTEM, timeout=T_SHORT), max_words=50) return {"session": sess["id"], "stage": "tale_told", "say": say or random.choice(TALE_THANKS), "gift": True, "expects": "done"} @@ -526,7 +563,7 @@ def _seal_llm(sess, llm): "human. Nothing risky, nothing without consent.\n" 'Return JSON only: {"moves": [{"task":"","where":"","proof":"","leave":""}, {...}, {...}]}' ) - resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=120) + resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=T_LONG) if not resp: return None try: diff --git a/app/oracle/weave.py b/app/oracle/weave.py index 2a7186a..a71e1ec 100644 --- a/app/oracle/weave.py +++ b/app/oracle/weave.py @@ -4,6 +4,10 @@ from .deck import REPO +# Same knob as session.py's T_LONG — the weave is the single most expensive call in the +# séance and was hardcoded to 120s, so tuning the others left this one untouched. +T_WEAVE = float(os.environ.get("ORACLE_T_LONG", "60")) + _LORE = None @@ -97,7 +101,7 @@ def weave_llm(question, cards, llm, located=None, context=""): "City is a clock + street grid, the Man at center, deep playa past it).\n\n" 'Return JSON only: {"reading": "...", "adventure": "..."}' ) - resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=120) + resp = llm.generate(prompt, system=SYSTEM, as_json=True, timeout=T_WEAVE) if not resp: return None try: diff --git a/app/web/kiosk.html b/app/web/kiosk.html index d3c6e65..ead712c 100644 --- a/app/web/kiosk.html +++ b/app/web/kiosk.html @@ -13,7 +13,10 @@ html,body{margin:0;height:100%;overflow:hidden} body{ background:var(--ink); color:var(--parch); - font-family:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif; + /* Android has none of the Apple/Windows serifs and would fall back to Roboto (a + sans) — "serif" and Noto Serif are the Galaxy Tab's real serif faces. */ + font-family:"Iowan Old Style","Palatino Linotype",Palatino,Georgia, + "Noto Serif","Droid Serif",serif; line-height:1.55; -webkit-font-smoothing:antialiased; touch-action:manipulation; user-select:none; } @@ -134,6 +137,11 @@ .cardcap{text-align:center;margin-top:9px;opacity:0;transition:opacity .6s} .cardcap.on{opacity:1} .cardcap .cslot{font-size:.66rem;letter-spacing:.3em;text-transform:uppercase;color:var(--gold-dim)} + /* the axis: a Shell card in a Tree slot, ~1 séance in 10. Quiet, not confetti — a + steady glow that says the machine knows this one is different. */ + .flip.axis{box-shadow:0 0 0 2px var(--gold),0 0 34px 6px rgba(198,160,74,.42)} + .cardcap.axis .cslot{color:var(--gold);animation:axispulse 3.2s ease-in-out infinite} + @keyframes axispulse{0%,100%{opacity:.65}50%{opacity:1}} .cardcap .cname{color:var(--gold);font-size:clamp(.9rem,1.8vw,1.12rem);line-height:1.25} .cardcap .cbite{color:#a3743f;font-size:.72rem;font-style:italic;margin-top:3px} .cardcap .cwhere{color:var(--parch-dim);font-size:.74rem;font-style:italic;margin-top:3px} @@ -265,13 +273,23 @@

The Quest Offered

const SLOTS=["roots","trunk","branches"]; const SLOTCAP={roots:"Face",trunk:"Stand",branches:"Reach"}; let SID=null, SPOKEN=true, VOICE=null, IDLE=null, CARD_IDS=""; +/* Which station this tablet is, from ?kiosk=1 — routes the print to its own printer. */ +const KIOSK=new URLSearchParams(location.search).get("kiosk")||""; /* ---------- voice of the turtle ---------- */ +/* Ranks across engines. macOS ships Daniel/Alex/Oliver; the Galaxy Tabs ship Google TTS + ("English United Kingdom" / male variants) or Samsung TTS, and none of the Apple names + exist there — an Apple-only ranking silently lands on a bright American default and the + Turtle stops sounding like a turtle. localService is weighted hard: on playa there is no + network voice, so a remote voice is no voice at all. */ function pickVoice(){ const vs=speechSynthesis.getVoices().filter(v=>v.lang&&v.lang.startsWith("en")); - const rank=v=>(/premium|enhanced/i.test(v.name)?4:0)+(/Daniel/i.test(v.name)?6:0) - +(/Oliver|Alex|Tom|Aaron|Evan|Nathan|Fred/i.test(v.name)?3:0) - +(v.localService?2:0)+(/en-GB/i.test(v.lang)?1:0); + const rank=v=>(/premium|enhanced|neural/i.test(v.name)?4:0) + +(/Daniel/i.test(v.name)?6:0) // macOS, the reference voice + +(/Oliver|Alex|Tom|Aaron|Evan|Nathan|Fred/i.test(v.name)?3:0) // macOS alternates + +(/\bmale\b|#male|_male/i.test(v.name)?3:0) // Google/Samsung naming + +(/\bgb\b|united kingdom|\bau\b|australia/i.test(v.name)?2:0) + +(v.localService?4:0)+(/en-GB/i.test(v.lang)?1:0); vs.sort((a,b)=>rank(b)-rank(a)); VOICE=vs[0]||null; } @@ -493,14 +511,17 @@

The Quest Offered

let next=0; const flips=[]; SLOTS.forEach((slot,i)=>{ const c=e.cards[slot]; + // roughly one séance in ten, a Shell card substitutes into a slot — the Tree's own + // spine. Mark it, or the rarest thing the deck can do passes unnoticed. + const isAxis = (e.axis_slot===slot) || c.realm==="shell"; const cell=document.createElement("div"); cell.innerHTML=` -
+
${c.name}
-
-
${SLOTCAP[slot]} · ${c.slot}
+
+
${isAxis?"◆ The Axis Speaks":`${SLOTCAP[slot]} · ${c.slot}`}
${c.name}
${c.shadow?`
the bite: ${c.shadow}
`:""} ${c.location&&c.location.directions?`
📍 ${c.location.directions}
`:""} @@ -578,7 +599,9 @@

${q.title}

$('print').addEventListener('click', async ()=>{ $('print').disabled=true; try{ - const r=await fetch("/api/print",{method:"POST"}).then(r=>r.json()); + const r=await fetch("/api/print",{method:"POST", + headers:{"Content-Type":"application/json"}, + body:JSON.stringify({session:SID,kiosk:KIOSK})}).then(r=>r.json()); toast(r.status==="printed"?"The shell is printing your quest… take the scroll.": "No printer attached — your quest was saved at the shell."); }catch(err){ toast("The printer spirit is unreachable."); } diff --git a/cards/art/branches-01.jpg b/cards/art/branches-01.jpg new file mode 100644 index 0000000..8bb5aa6 Binary files /dev/null and b/cards/art/branches-01.jpg differ diff --git a/cards/art/branches-02.jpg b/cards/art/branches-02.jpg new file mode 100644 index 0000000..81b1ea5 Binary files /dev/null and b/cards/art/branches-02.jpg differ diff --git a/cards/art/branches-03.jpg b/cards/art/branches-03.jpg new file mode 100644 index 0000000..5408ef7 Binary files /dev/null and b/cards/art/branches-03.jpg differ diff --git a/cards/art/branches-04.jpg b/cards/art/branches-04.jpg new file mode 100644 index 0000000..0631d87 Binary files /dev/null and b/cards/art/branches-04.jpg differ diff --git a/cards/art/branches-05.jpg b/cards/art/branches-05.jpg new file mode 100644 index 0000000..9b6ccc1 Binary files /dev/null and b/cards/art/branches-05.jpg differ diff --git a/cards/art/branches-06.jpg b/cards/art/branches-06.jpg new file mode 100644 index 0000000..7111c85 Binary files /dev/null and b/cards/art/branches-06.jpg differ diff --git a/cards/art/branches-07.jpg b/cards/art/branches-07.jpg new file mode 100644 index 0000000..28f9caf Binary files /dev/null and b/cards/art/branches-07.jpg differ diff --git a/cards/art/branches-08.jpg b/cards/art/branches-08.jpg new file mode 100644 index 0000000..9d7c69d Binary files /dev/null and b/cards/art/branches-08.jpg differ diff --git a/cards/art/branches-09.jpg b/cards/art/branches-09.jpg new file mode 100644 index 0000000..b548262 Binary files /dev/null and b/cards/art/branches-09.jpg differ diff --git a/cards/art/branches-10.jpg b/cards/art/branches-10.jpg new file mode 100644 index 0000000..ad1885d Binary files /dev/null and b/cards/art/branches-10.jpg differ diff --git a/cards/art/branches-11.jpg b/cards/art/branches-11.jpg new file mode 100644 index 0000000..6b9c873 Binary files /dev/null and b/cards/art/branches-11.jpg differ diff --git a/cards/art/branches-12.jpg b/cards/art/branches-12.jpg new file mode 100644 index 0000000..2d0acfd Binary files /dev/null and b/cards/art/branches-12.jpg differ diff --git a/cards/art/prompts-used.json b/cards/art/prompts-used.json new file mode 100644 index 0000000..d3ca9b7 --- /dev/null +++ b/cards/art/prompts-used.json @@ -0,0 +1,50 @@ +{ + "shell-01": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: An immense ancient turtle seen from the side, so vast that its shell IS the desert floor \u2014 mesas and a lone cactus stand on its back, and the World Tree grows straight up from the crown of the shell. The turtle's head is lowered and its jaws are closed, with quiet finality, on one single taut root. Everything else about the creature is patient and still; only the bite is decisive. Deep carved strata beneath it. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-02": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A colossal wooden effigy of a man built as a spiral staircase tower \u2014 one half still clean carved timber, the other half already burnt to glowing embers and ash, the two halves meeting down the exact centre line. The spiral stair runs both up into the figure and down into the ground. At its base one small figure stands holding a lit torch in one hand and a watering can in the other, looking up, having not yet chosen. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-03": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A domed temple open to the night sky, a single enormous night-blooming flower opened wide at its centre and lit gold from within. Figures file out through the doorway with empty hands, having left small objects on the shelves \u2014 and one figure has made a bed of blankets among the offerings and lies asleep there, settled in, while everyone else leaves. The flower is fully open and will close by morning. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-04": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A tall slender wooden tower of stacked rings. One figure at its base speaks quietly into an opening at the bottom, and the tower carries it upward as widening bands of gold light that leave the top and cross the whole sky. Beside the tower a second figure shouts through an enormous horn, straining, and it produces only a thick plume of dust that hangs in the air and falls back down. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-05": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: An immense tree of bound bamboo. Below the ground line its roots do not end in soil \u2014 they end in hundreds of small open human hands holding them up, ranks of them receding into the dark. In the hollow between two great roots a figure sits comfortably, leaning back, sheltered. Beside them, forgotten, a single small sapling stands in a tin can, its roots dry and exposed, never planted. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-06": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A long low fence of weathered slats running the full width of the card, close to the viewer. A lone figure stands at the fence with both hands on it, back to us, looking through and away toward a distant glittering city on the flat horizon \u2014 the fence frames that view like a window. At one end the same fence has been built up into a solid blank wall twice a person's height, with nothing behind it but empty dust. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-07": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: An enormous turtle shell resting on the playa and propped open like a lid, warm light spilling from inside, mismatched figures sitting close together within it \u2014 someone with tools, someone with a pot, someone with an instrument \u2014 and at the raised lip a hand reaching down to pull one more traveller up and in. Some distance behind it, a second identical shell sits clamped shut on the dust, with one small silhouette visible inside. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-08": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A seated figure facing a squat carved machine shaped like a turtle, oracle slot at its front. The machine's face is a polished mirror, so the seeker is looking directly at their own reflection. A printed slip has emerged from the slot and it is completely blank. The seeker's own hand has stopped halfway to it. The scene is calm, not sinister. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-09": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A towering octopus welded from scrap metal, fire pouring from two of its raised arms, a ring of small figures gathered close with their hands out to the warmth. From this angle one lowered tentacle is open along its underside, showing it is hollow \u2014 and a single figure stands back there alone, at the exact spot where that hollow is the only thing visible. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-10": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A figure feeding a flawless smiling mannequin of themselves head-first into a large hand-cranked chipper. What sprays out the far side is not plastic but dark rich earth, already sprouting. Behind them a second figure feeds an identical mannequin into an identical chipper while looking directly out at a ring of raised camera-poles and lit screens, posed, chin lifted. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-11": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: An immense steel staff standing upright on the playa, two great serpents coiled around it in opposition, their tension holding it up \u2014 remove either and it falls. At its base two figures face each other with clasped hands. On the ground exactly between their feet lies a bared blade, unhidden and plainly visible to both, not buried and not thrown away. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "shell-12": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [SHELL undertone: SECOND INK \u2014 metallic gold, used lavishly, far more than any other realm: a full radiant sunburst behind the subject, gilded ornament throughout, gold rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND HEAVIER: an ornate engraved gold border several times the width of a plain rule, with a decorative corner boss at each of the four corners, so the card is identifiable as one of the twelve from across a room. Small carved turtle-shell glyph in a top corner.] Subject: A tall hand-built timber archway, its joinery visibly immaculate and precisely fitted, surmounted by a comically enormous carved rubber chicken. Figures in absurd costume \u2014 one in a jester's cap, one wearing a traffic cone \u2014 work on the joints with real carpentry tools and total concentration. Off to one side a masked figure stands with hands in pockets, laughing, back turned to the work, touching nothing. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-01": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A deep vertical shaft cut below the ground line, its walls hung with dozens of glowing round spheres like a constellation. A figure climbs up a ladder formed of those spheres toward the opening far above. Lower down, in a hollowed alcove off the shaft, a second figure has made a nest among the spheres and lies curled and comfortable, not climbing. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-02": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A colossal ribcage standing on the desert floor and built like a small chapel \u2014 the ribs are its walls, and a single lamp shaped like a heart hangs at its center on a long chain. One empty chair sits directly beneath the heart. In the near rib a low door stands open, unlatched, with a path of stones leading out of it into the dark. The room is tended, not abandoned. Dense subterranean cross-hatching all around. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-03": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: An enormous ship broken clean in half, its bow sunk deep into cracked playa and still going down. A figure grips a taut rope tied to the sinking half and is being dragged toward it, heels furrowing the dust. To one side another figure has released their rope and stands clear, watching. Further off, a third walks away from a rope still tied to something entirely intact and sitting level on solid ground. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-04": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A colossal reclining human figure lying on the playa whose body is a topographic landscape \u2014 ridges, dry valleys, contour lines. A tiny traveller with a lantern walks across the sleeping giant's chest, mapping it. Down at the giant's feet a small circle of ordinary people sit around a fire that has burned down to embers, faces turned toward the traveller, waiting. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-05": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A figure lying on their back in the dust sweeping their arms and legs to make a dust angel, chalk-white with alkali, laughing, eyes open. Beside them a second figure lies face-down and motionless, limbs slack, already half drifted over by blown dust. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-06": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: Two facing rows of figures holding cloths and basins form a corridor. A person walks through it with arms outstretched and eyes closed, and around their body is a carved arc of ribbon-work like a heraldic shield \u2014 clearly drawn, enclosing them, a spoken boundary made visible. Behind them a second person walks the same corridor with no arc at all, head down, arms hanging. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-07": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: The interior of a low domed tent, warm and dim. Two figures sit cross-legged on the ground facing each other, one holding the other's hands while they weather something hard. Just outside the doorway a third figure stands holding a folded blanket, facing in, ready \u2014 and directly behind that figure their own dark doorway stands open, unentered, with nothing coming out of it. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-08": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A lone small figure walking away from the viewer into an enormous dark emptiness, the lights of the distant city glittering far behind them. A single unbroken line of their own footprints runs back from their heels toward those lights. Much further out, a second figure walks in the same direction with no footprints behind them at all. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-09": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: An ornate vehicle standing on the playa, its left half a charred blackened wreck and its right half newly rebuilt in bright worked metal, luminous \u2014 figures on ladders work along the seam with tools, mid-repair. Some distance away a lone figure sits on an upturned crate facing an untouched burnt hulk, hands empty in their lap, waiting. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-10": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A slope below the ground line cut into a staircase of curved water terraces. On one terrace a kneeling figure pours water from a can onto a small green shoot pushing through the dust. On the terrace directly beside it a shrivelled seedling has died, and a full watering can sits beside it on its side, a skin of dust across the top. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-11": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A figure lying beneath a canopy of suspended metal singing bowls, gold ripples spreading in rings down over their body, which is drawn as worn ground marked with old scars and seams. At the edge of the frame a second figure lies walled in by bowls stacked into a fortress around them \u2014 and just outside that wall, out of reach, a heavy pack and a shovel wait in the dust. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "roots-12": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [ROOTS undertone: SECOND INK \u2014 deep indigo blue, used heavily and unmistakably: the entire lower half of the card below the ground line is printed in dark indigo rather than black, indigo soaking the subterranean cross-hatching, indigo shadow pooling under the subject. The card must read as blue-black, not brown. Downward pull; dense underground detail. Gold only as a small accent. Small carved root-knot glyph in a top corner.] Subject: A figure kneels on bare cracked playa scoring an enormous intricate radiating design into the dust with a single stick; the pattern spreads out around them and is beautiful and clearly temporary. Behind them, on the same empty ground, a second figure has built a small tidy permanent cottage with a picket fence and a mailbox, and stands at the gate with their arms folded. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-01": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A great turtle mid-stride across the flat playa, moving with visible slowness, its jaws closed hard and final on one single taut rope that runs off the edge of the frame. Behind it on the same ground sits a second turtle fully retracted, shell sealed shut, dust drifted high against its sides, clearly unmoved for a long time. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-02": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A crowd standing along a low horizon facing a rising sun, faces lit gold, one figure among them with head tilted back having arrived exactly in time. To one side, propped upright against a stack of speakers, another figure sleeps standing with their chin on their chest, facing away from the sunrise entirely. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-03": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: An enormous heart of riveted metal standing on the playa, cracked through from top to base, gold light pouring out of every fracture. A figure stands in that light with arms open. Another sits on the ground with their back against the heart in its shadow, hands held up to a single crack for warmth, not moving. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-04": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A line of figures in silhouette along a flat horizon, heads thrown back, mouths open. Their sound is carved as thick radiating rays that fill the entire upper sky like a sunburst \u2014 the noise and the sunrise are the same thing. At the exact center of the line one figure stands with head level and mouth closed, hands open at their sides, simply present. A grounded horizon line runs the full width. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-05": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A great tented pavilion at the meeting point of wide roads that converge from every edge of the frame, small figures streaming inward along all of them. One figure walks steadily in toward the pavilion. Another walks a tight closed ring around it, and their path has worn a deep visible rut in the dust from going round so many times. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-06": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A weathered wooden information kiosk. A ranger leans on the counter with one arm outstretched, pointing away toward the open playa rather than at a map. One traveller is already walking off along that line. At the counter another traveller stands holding a thick fan of written question-slips, handing over yet another. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-07": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A figure crouched alone on an immense empty stretch of clean playa, pinching one tiny scrap of debris from the dust, no one anywhere near them. In the middle distance a second figure sweeps an already spotless square of ground with great concentration, and beside that figure a full set of untouched tools and raw materials sits in a neat unopened stack. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-08": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A figure sitting in a plain folding camp chair on flat open playa doing nothing in particular, ordinary and unposed \u2014 and a broad carved sunburst of gold light falls across them anyway, treating them as worth looking at. Nearby, a second figure reclines on an ornate throne with lamps on poles aimed at themselves, arranged in a posture of rest. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-09": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: Two figures sitting together on the ground holding hands, heads bowed, enclosed on all sides by a churning wall of white dust. At one edge of the frame that wall simply ends: clear air, a clean horizon, open sun \u2014 and a third figure sits there under a pulled-down tarp with their hood up and their back to all that light. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-10": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: Two figures facing each other, one holding out an open hand in offering, the other with palm raised flat in a clear refusal. Between them a single clean gold line is drawn across the ground. The offering figure has inclined their head, accepting it. Behind them a third figure strides across an identical gold line without looking down at it. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-11": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A well-provisioned traveller stands on the playa with water bottles and gear neatly stowed, holding out a full canteen to a stranger. Beside them a second figure walks bent almost double beneath an enormous overloaded pack, mouth cracked and dry, passing an offered canteen held out by another hand without turning their head toward it. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "trunk-12": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [TRUNK undertone: SECOND INK \u2014 burnt rust-orange ochre, clearly visible: rust in the sky wash, rust in the horizon band, rust warming the midtones. A strong grounded horizon line across the full width. Balanced, upright, weighty. Small carved trunk-ring glyph in a top corner.] Subject: A small open-sided tea structure. One figure sits upright at a low table with a single cup, hands still, eyes open, entirely present. Behind them in the same structure a second figure lies sprawled among a dozen scattered cups with the canvas walls pulled closed and eyes shut, the lit city visible through the one remaining gap. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-01": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A single tree standing on the vertical axis, its canopy above the ground line and its root mass below mirroring it exactly in size and spread. To one side a slender sapling with a shallow root plate is tipping over sideways in the wind, half lifted out of the dust. To the other side a broad cut stump sits above an enormous root system, rotting, with nothing growing from it. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-02": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: Seven bright stars in the upper sky, each joined by a fine gold thread down to a small figure standing alone far apart from the others on the flat playa, every one of them looking up. The nearest figure holds their thread. Behind that figure, on the ground, a small dark doorway stands shut with a slack unheld thread running toward it, and they have turned their back to it. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-03": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A traveller in the foreground has just set a small handmade object down on a flat stone cairn and is already walking away, back turned, head down, not looking at it \u2014 their hands are empty and open at their sides. Far behind them, small and brightly lit on a distant stage, another figure holds an identical object high above their head toward a crowd of raised arms. The near figure is large, quiet and unlit; the distant one is tiny, radiant and surrounded. The cairn stands on the vertical axis of the card. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-04": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: Two figures facing each other. One presses a small carved wooden name-token into the open palms of the other, who stands relaxed and entirely recognisable as themselves. Beside them a third figure stands hung all over with dozens of name-tokens on strings, so many that their face and body are completely obscured by them. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-05": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: Two dust-covered figures meeting in a full embrace, their arms and bent backs forming a clean archway between them. Through that arch, a road runs to the horizon, and a line of small travellers is already walking through the opening the two of them make. The embrace is the gate. Airy negative space above, a scatter of small carved stars. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-06": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: An open market aisle of rough shelving on the playa. One figure stands in it plainly, empty-handed, arms at their sides, easy to see \u2014 and a passing stranger has stopped mid-step and turned toward them. Further along the aisle another figure stands behind a long table covered end to end with their entire life laid out in labelled objects, and the crowd flows past without slowing. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-07": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A dust-caked traveller seated in a velvet armchair on the open playa, being poured tea by an attendant in a crisp uniform with a folded towel over one arm. Beside them a second attendant serves another guest while balancing a tall stack of towels \u2014 and directly behind that attendant sits an identical empty velvet armchair with their own name lettered on a small card, never sat in. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-08": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A temple-like structure of speakers and carved arches. The dancing crowd before it is drawn as one rising flame, arms up, bodies merging into the shape of fire, and at its heart a single figure is dissolving into light. At the far outer edge one figure dances alone with eyes shut and face turned away from the crowd, and behind them a plain door stands open onto empty dark. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-09": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A daylight crowd dancing in full hard sun and thick dust, arms raised, faces turned toward one another and open. In the middle of them one figure dances with their arms up the same as everyone else but their face turned away from every other face, and a clean circle of empty ground surrounds their feet that no one steps into. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-10": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A workbench where circuit boards, wire and salvaged components grow upward and flower into an intricate blossoming structure reaching into the sky \u2014 clearly useless, clearly beautiful \u2014 with its maker standing back looking up at it. Beside them a second figure sits entirely enclosed inside a dense lattice cage woven from their own wiring, still working, with a blank unwritten page resting untouched on their knee. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-11": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: A figure standing proudly beside an absurd inexplicable machine they have built out of salvage \u2014 and the machine's silhouette unmistakably echoes the shape of their own body and face. Beside them another figure wears an elaborate outlandish mask and stands next to nothing at all, hands empty at their sides. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image.", + "branches-12": "Hand-carved woodblock print / letterpress relief illustration, bold black ink linework with visible carving texture, cross-hatch and stipple shading, printed on warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. Flat printed ink \u2014 no 3D render, no photography, no gradients, no digital smoothness. Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing space. Thin double gold border just inside the card edge. A subtle vertical World-Tree axis motif somewhere in the composition \u2014 the spine of the deck. SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali playa stretching to the horizon, cracked dust, distant low barren desert mountains, enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO rivers or lakes, NO rolling hills \u2014 the only tree that may ever appear is the World Tree itself. If the subject implies a landscape, that landscape is still this desert. [BRANCHES undertone: SECOND INK \u2014 pale sky blue, clearly visible: blue filling the open sky, blue in the leaves and small carved stars. Upward reach, airy negative space, the lightest of the four. Small carved branch-star glyph in a top corner.] Subject: An enormous labyrinth scored into the playa in concentric rings. One figure is deep inside it, close to the centre, carrying a small object to set down. Out on the furthest ring another figure walks the outer circuit, which they have worn into a deep smooth track, passing the labyrinth's entrance again without turning in. Leave a clean empty banner cartouche across the bottom sixth of the image for a title to be printed later. Absolutely no letters, words, numerals or signatures anywhere in the image." +} \ No newline at end of file diff --git a/cards/art/roots-01.jpg b/cards/art/roots-01.jpg new file mode 100644 index 0000000..15ff872 Binary files /dev/null and b/cards/art/roots-01.jpg differ diff --git a/cards/art/roots-02.jpg b/cards/art/roots-02.jpg new file mode 100644 index 0000000..75563c8 Binary files /dev/null and b/cards/art/roots-02.jpg differ diff --git a/cards/art/roots-03.jpg b/cards/art/roots-03.jpg new file mode 100644 index 0000000..7782b85 Binary files /dev/null and b/cards/art/roots-03.jpg differ diff --git a/cards/art/roots-04.jpg b/cards/art/roots-04.jpg new file mode 100644 index 0000000..533c0ca Binary files /dev/null and b/cards/art/roots-04.jpg differ diff --git a/cards/art/roots-05.jpg b/cards/art/roots-05.jpg new file mode 100644 index 0000000..b1e3894 Binary files /dev/null and b/cards/art/roots-05.jpg differ diff --git a/cards/art/roots-06.jpg b/cards/art/roots-06.jpg new file mode 100644 index 0000000..fb20a5d Binary files /dev/null and b/cards/art/roots-06.jpg differ diff --git a/cards/art/roots-07.jpg b/cards/art/roots-07.jpg new file mode 100644 index 0000000..0eac1ed Binary files /dev/null and b/cards/art/roots-07.jpg differ diff --git a/cards/art/roots-08.jpg b/cards/art/roots-08.jpg new file mode 100644 index 0000000..80c5ca6 Binary files /dev/null and b/cards/art/roots-08.jpg differ diff --git a/cards/art/roots-09.jpg b/cards/art/roots-09.jpg new file mode 100644 index 0000000..a9a57d6 Binary files /dev/null and b/cards/art/roots-09.jpg differ diff --git a/cards/art/roots-10.jpg b/cards/art/roots-10.jpg new file mode 100644 index 0000000..e04e84f Binary files /dev/null and b/cards/art/roots-10.jpg differ diff --git a/cards/art/roots-11.jpg b/cards/art/roots-11.jpg new file mode 100644 index 0000000..c308411 Binary files /dev/null and b/cards/art/roots-11.jpg differ diff --git a/cards/art/roots-12.jpg b/cards/art/roots-12.jpg new file mode 100644 index 0000000..aff6541 Binary files /dev/null and b/cards/art/roots-12.jpg differ diff --git a/cards/art/shell-01.jpg b/cards/art/shell-01.jpg new file mode 100644 index 0000000..0c1beff Binary files /dev/null and b/cards/art/shell-01.jpg differ diff --git a/cards/art/shell-02.jpg b/cards/art/shell-02.jpg new file mode 100644 index 0000000..af12f2b Binary files /dev/null and b/cards/art/shell-02.jpg differ diff --git a/cards/art/shell-03.jpg b/cards/art/shell-03.jpg new file mode 100644 index 0000000..98d8b77 Binary files /dev/null and b/cards/art/shell-03.jpg differ diff --git a/cards/art/shell-04.jpg b/cards/art/shell-04.jpg new file mode 100644 index 0000000..07c0b63 Binary files /dev/null and b/cards/art/shell-04.jpg differ diff --git a/cards/art/shell-05.jpg b/cards/art/shell-05.jpg new file mode 100644 index 0000000..16220b5 Binary files /dev/null and b/cards/art/shell-05.jpg differ diff --git a/cards/art/shell-06.jpg b/cards/art/shell-06.jpg new file mode 100644 index 0000000..004b842 Binary files /dev/null and b/cards/art/shell-06.jpg differ diff --git a/cards/art/shell-07.jpg b/cards/art/shell-07.jpg new file mode 100644 index 0000000..abf48ca Binary files /dev/null and b/cards/art/shell-07.jpg differ diff --git a/cards/art/shell-08.jpg b/cards/art/shell-08.jpg new file mode 100644 index 0000000..d8a775e Binary files /dev/null and b/cards/art/shell-08.jpg differ diff --git a/cards/art/shell-09.jpg b/cards/art/shell-09.jpg new file mode 100644 index 0000000..6a98fba Binary files /dev/null and b/cards/art/shell-09.jpg differ diff --git a/cards/art/shell-10.jpg b/cards/art/shell-10.jpg new file mode 100644 index 0000000..319c1c9 Binary files /dev/null and b/cards/art/shell-10.jpg differ diff --git a/cards/art/shell-11.jpg b/cards/art/shell-11.jpg new file mode 100644 index 0000000..c890cab Binary files /dev/null and b/cards/art/shell-11.jpg differ diff --git a/cards/art/shell-12.jpg b/cards/art/shell-12.jpg new file mode 100644 index 0000000..308a283 Binary files /dev/null and b/cards/art/shell-12.jpg differ diff --git a/cards/art/trunk-01.jpg b/cards/art/trunk-01.jpg new file mode 100644 index 0000000..fc3fb9d Binary files /dev/null and b/cards/art/trunk-01.jpg differ diff --git a/cards/art/trunk-02.jpg b/cards/art/trunk-02.jpg new file mode 100644 index 0000000..6370a12 Binary files /dev/null and b/cards/art/trunk-02.jpg differ diff --git a/cards/art/trunk-03.jpg b/cards/art/trunk-03.jpg new file mode 100644 index 0000000..ed632e2 Binary files /dev/null and b/cards/art/trunk-03.jpg differ diff --git a/cards/art/trunk-04.jpg b/cards/art/trunk-04.jpg new file mode 100644 index 0000000..0c9783d Binary files /dev/null and b/cards/art/trunk-04.jpg differ diff --git a/cards/art/trunk-05.jpg b/cards/art/trunk-05.jpg new file mode 100644 index 0000000..f18dd1b Binary files /dev/null and b/cards/art/trunk-05.jpg differ diff --git a/cards/art/trunk-06.jpg b/cards/art/trunk-06.jpg new file mode 100644 index 0000000..bc01dbe Binary files /dev/null and b/cards/art/trunk-06.jpg differ diff --git a/cards/art/trunk-07.jpg b/cards/art/trunk-07.jpg new file mode 100644 index 0000000..8cb69ae Binary files /dev/null and b/cards/art/trunk-07.jpg differ diff --git a/cards/art/trunk-08.jpg b/cards/art/trunk-08.jpg new file mode 100644 index 0000000..44d65e4 Binary files /dev/null and b/cards/art/trunk-08.jpg differ diff --git a/cards/art/trunk-09.jpg b/cards/art/trunk-09.jpg new file mode 100644 index 0000000..c535a85 Binary files /dev/null and b/cards/art/trunk-09.jpg differ diff --git a/cards/art/trunk-10.jpg b/cards/art/trunk-10.jpg new file mode 100644 index 0000000..f6d6ff4 Binary files /dev/null and b/cards/art/trunk-10.jpg differ diff --git a/cards/art/trunk-11.jpg b/cards/art/trunk-11.jpg new file mode 100644 index 0000000..1ae14bf Binary files /dev/null and b/cards/art/trunk-11.jpg differ diff --git a/cards/art/trunk-12.jpg b/cards/art/trunk-12.jpg new file mode 100644 index 0000000..d319785 Binary files /dev/null and b/cards/art/trunk-12.jpg differ diff --git a/cards/contact-sheet.png b/cards/contact-sheet.png index 7a3fe27..ccf2cb8 100644 Binary files a/cards/contact-sheet.png and b/cards/contact-sheet.png differ diff --git a/cards/web/med/branches-01.jpg b/cards/web/med/branches-01.jpg index d37bc93..f043b79 100644 Binary files a/cards/web/med/branches-01.jpg and b/cards/web/med/branches-01.jpg differ diff --git a/cards/web/med/branches-02.jpg b/cards/web/med/branches-02.jpg index 8effa4c..b0d9315 100644 Binary files a/cards/web/med/branches-02.jpg and b/cards/web/med/branches-02.jpg differ diff --git a/cards/web/med/branches-03.jpg b/cards/web/med/branches-03.jpg index 2c66981..290b068 100644 Binary files a/cards/web/med/branches-03.jpg and b/cards/web/med/branches-03.jpg differ diff --git a/cards/web/med/branches-04.jpg b/cards/web/med/branches-04.jpg index 11dea59..f345259 100644 Binary files a/cards/web/med/branches-04.jpg and b/cards/web/med/branches-04.jpg differ diff --git a/cards/web/med/branches-05.jpg b/cards/web/med/branches-05.jpg index 7c843be..117a1f6 100644 Binary files a/cards/web/med/branches-05.jpg and b/cards/web/med/branches-05.jpg differ diff --git a/cards/web/med/branches-06.jpg b/cards/web/med/branches-06.jpg index c22110a..26adf14 100644 Binary files a/cards/web/med/branches-06.jpg and b/cards/web/med/branches-06.jpg differ diff --git a/cards/web/med/branches-07.jpg b/cards/web/med/branches-07.jpg index 21266bf..193f2ea 100644 Binary files a/cards/web/med/branches-07.jpg and b/cards/web/med/branches-07.jpg differ diff --git a/cards/web/med/branches-08.jpg b/cards/web/med/branches-08.jpg index 7559b01..32b990b 100644 Binary files a/cards/web/med/branches-08.jpg and b/cards/web/med/branches-08.jpg differ diff --git a/cards/web/med/branches-09.jpg b/cards/web/med/branches-09.jpg index 130d1c4..f80d5ae 100644 Binary files a/cards/web/med/branches-09.jpg and b/cards/web/med/branches-09.jpg differ diff --git a/cards/web/med/branches-10.jpg b/cards/web/med/branches-10.jpg index 5d90182..5434dab 100644 Binary files a/cards/web/med/branches-10.jpg and b/cards/web/med/branches-10.jpg differ diff --git a/cards/web/med/branches-11.jpg b/cards/web/med/branches-11.jpg index 21110e2..0a89482 100644 Binary files a/cards/web/med/branches-11.jpg and b/cards/web/med/branches-11.jpg differ diff --git a/cards/web/med/branches-12.jpg b/cards/web/med/branches-12.jpg index 92c20b7..a89d156 100644 Binary files a/cards/web/med/branches-12.jpg and b/cards/web/med/branches-12.jpg differ diff --git a/cards/web/med/roots-01.jpg b/cards/web/med/roots-01.jpg index b80407e..7a8160b 100644 Binary files a/cards/web/med/roots-01.jpg and b/cards/web/med/roots-01.jpg differ diff --git a/cards/web/med/roots-02.jpg b/cards/web/med/roots-02.jpg index a6a7825..3e9eafa 100644 Binary files a/cards/web/med/roots-02.jpg and b/cards/web/med/roots-02.jpg differ diff --git a/cards/web/med/roots-03.jpg b/cards/web/med/roots-03.jpg index d4043eb..3aa56ac 100644 Binary files a/cards/web/med/roots-03.jpg and b/cards/web/med/roots-03.jpg differ diff --git a/cards/web/med/roots-04.jpg b/cards/web/med/roots-04.jpg index 0f3c786..3b3ee49 100644 Binary files a/cards/web/med/roots-04.jpg and b/cards/web/med/roots-04.jpg differ diff --git a/cards/web/med/roots-05.jpg b/cards/web/med/roots-05.jpg index 83162ca..d2c8cb3 100644 Binary files a/cards/web/med/roots-05.jpg and b/cards/web/med/roots-05.jpg differ diff --git a/cards/web/med/roots-06.jpg b/cards/web/med/roots-06.jpg index e000488..5898b20 100644 Binary files a/cards/web/med/roots-06.jpg and b/cards/web/med/roots-06.jpg differ diff --git a/cards/web/med/roots-07.jpg b/cards/web/med/roots-07.jpg index ab63c2e..a0d922d 100644 Binary files a/cards/web/med/roots-07.jpg and b/cards/web/med/roots-07.jpg differ diff --git a/cards/web/med/roots-08.jpg b/cards/web/med/roots-08.jpg index 2353a9d..8c4fc62 100644 Binary files a/cards/web/med/roots-08.jpg and b/cards/web/med/roots-08.jpg differ diff --git a/cards/web/med/roots-09.jpg b/cards/web/med/roots-09.jpg index 681f42e..782107b 100644 Binary files a/cards/web/med/roots-09.jpg and b/cards/web/med/roots-09.jpg differ diff --git a/cards/web/med/roots-10.jpg b/cards/web/med/roots-10.jpg index c597d47..abab322 100644 Binary files a/cards/web/med/roots-10.jpg and b/cards/web/med/roots-10.jpg differ diff --git a/cards/web/med/roots-11.jpg b/cards/web/med/roots-11.jpg index f7f8b69..3f545b7 100644 Binary files a/cards/web/med/roots-11.jpg and b/cards/web/med/roots-11.jpg differ diff --git a/cards/web/med/roots-12.jpg b/cards/web/med/roots-12.jpg index 3bb750a..46fcc2f 100644 Binary files a/cards/web/med/roots-12.jpg and b/cards/web/med/roots-12.jpg differ diff --git a/cards/web/med/shell-01.jpg b/cards/web/med/shell-01.jpg index c92e0ff..c037c2b 100644 Binary files a/cards/web/med/shell-01.jpg and b/cards/web/med/shell-01.jpg differ diff --git a/cards/web/med/shell-02.jpg b/cards/web/med/shell-02.jpg index 70e335c..9cc5d6d 100644 Binary files a/cards/web/med/shell-02.jpg and b/cards/web/med/shell-02.jpg differ diff --git a/cards/web/med/shell-03.jpg b/cards/web/med/shell-03.jpg index 79c595e..aa1dfb2 100644 Binary files a/cards/web/med/shell-03.jpg and b/cards/web/med/shell-03.jpg differ diff --git a/cards/web/med/shell-04.jpg b/cards/web/med/shell-04.jpg index 3aca857..84a2f06 100644 Binary files a/cards/web/med/shell-04.jpg and b/cards/web/med/shell-04.jpg differ diff --git a/cards/web/med/shell-05.jpg b/cards/web/med/shell-05.jpg index 6367cb7..3bf5d4e 100644 Binary files a/cards/web/med/shell-05.jpg and b/cards/web/med/shell-05.jpg differ diff --git a/cards/web/med/shell-06.jpg b/cards/web/med/shell-06.jpg index 66470b8..c764561 100644 Binary files a/cards/web/med/shell-06.jpg and b/cards/web/med/shell-06.jpg differ diff --git a/cards/web/med/shell-07.jpg b/cards/web/med/shell-07.jpg index c0b0866..e25f4eb 100644 Binary files a/cards/web/med/shell-07.jpg and b/cards/web/med/shell-07.jpg differ diff --git a/cards/web/med/shell-08.jpg b/cards/web/med/shell-08.jpg index e01c2ee..34ca2d7 100644 Binary files a/cards/web/med/shell-08.jpg and b/cards/web/med/shell-08.jpg differ diff --git a/cards/web/med/shell-09.jpg b/cards/web/med/shell-09.jpg index 4659a93..ae6d3ab 100644 Binary files a/cards/web/med/shell-09.jpg and b/cards/web/med/shell-09.jpg differ diff --git a/cards/web/med/shell-10.jpg b/cards/web/med/shell-10.jpg index 8a683f4..fe13d7f 100644 Binary files a/cards/web/med/shell-10.jpg and b/cards/web/med/shell-10.jpg differ diff --git a/cards/web/med/shell-11.jpg b/cards/web/med/shell-11.jpg index 4a0c24b..df38767 100644 Binary files a/cards/web/med/shell-11.jpg and b/cards/web/med/shell-11.jpg differ diff --git a/cards/web/med/shell-12.jpg b/cards/web/med/shell-12.jpg index 4997f19..e5edfb0 100644 Binary files a/cards/web/med/shell-12.jpg and b/cards/web/med/shell-12.jpg differ diff --git a/cards/web/med/trunk-01.jpg b/cards/web/med/trunk-01.jpg index 4da80b6..62d9891 100644 Binary files a/cards/web/med/trunk-01.jpg and b/cards/web/med/trunk-01.jpg differ diff --git a/cards/web/med/trunk-02.jpg b/cards/web/med/trunk-02.jpg index 6351192..2206c5d 100644 Binary files a/cards/web/med/trunk-02.jpg and b/cards/web/med/trunk-02.jpg differ diff --git a/cards/web/med/trunk-03.jpg b/cards/web/med/trunk-03.jpg index 2b1be79..de6604b 100644 Binary files a/cards/web/med/trunk-03.jpg and b/cards/web/med/trunk-03.jpg differ diff --git a/cards/web/med/trunk-04.jpg b/cards/web/med/trunk-04.jpg index 3bc8044..7da61aa 100644 Binary files a/cards/web/med/trunk-04.jpg and b/cards/web/med/trunk-04.jpg differ diff --git a/cards/web/med/trunk-05.jpg b/cards/web/med/trunk-05.jpg index 8f35485..6dca6fb 100644 Binary files a/cards/web/med/trunk-05.jpg and b/cards/web/med/trunk-05.jpg differ diff --git a/cards/web/med/trunk-06.jpg b/cards/web/med/trunk-06.jpg index 235dc65..ec8064a 100644 Binary files a/cards/web/med/trunk-06.jpg and b/cards/web/med/trunk-06.jpg differ diff --git a/cards/web/med/trunk-07.jpg b/cards/web/med/trunk-07.jpg index b054407..2b63c58 100644 Binary files a/cards/web/med/trunk-07.jpg and b/cards/web/med/trunk-07.jpg differ diff --git a/cards/web/med/trunk-08.jpg b/cards/web/med/trunk-08.jpg index 9b222fe..17a46f7 100644 Binary files a/cards/web/med/trunk-08.jpg and b/cards/web/med/trunk-08.jpg differ diff --git a/cards/web/med/trunk-09.jpg b/cards/web/med/trunk-09.jpg index 4b4ace3..5831d59 100644 Binary files a/cards/web/med/trunk-09.jpg and b/cards/web/med/trunk-09.jpg differ diff --git a/cards/web/med/trunk-10.jpg b/cards/web/med/trunk-10.jpg index e33bcb8..374a643 100644 Binary files a/cards/web/med/trunk-10.jpg and b/cards/web/med/trunk-10.jpg differ diff --git a/cards/web/med/trunk-11.jpg b/cards/web/med/trunk-11.jpg index 38773c2..1c0f832 100644 Binary files a/cards/web/med/trunk-11.jpg and b/cards/web/med/trunk-11.jpg differ diff --git a/cards/web/med/trunk-12.jpg b/cards/web/med/trunk-12.jpg index d40c60c..4e8493d 100644 Binary files a/cards/web/med/trunk-12.jpg and b/cards/web/med/trunk-12.jpg differ diff --git a/cards/web/thumb/branches-01.jpg b/cards/web/thumb/branches-01.jpg index f6dde15..5f00fc0 100644 Binary files a/cards/web/thumb/branches-01.jpg and b/cards/web/thumb/branches-01.jpg differ diff --git a/cards/web/thumb/branches-02.jpg b/cards/web/thumb/branches-02.jpg index 4d06cef..14b242b 100644 Binary files a/cards/web/thumb/branches-02.jpg and b/cards/web/thumb/branches-02.jpg differ diff --git a/cards/web/thumb/branches-03.jpg b/cards/web/thumb/branches-03.jpg index db50061..15327f9 100644 Binary files a/cards/web/thumb/branches-03.jpg and b/cards/web/thumb/branches-03.jpg differ diff --git a/cards/web/thumb/branches-04.jpg b/cards/web/thumb/branches-04.jpg index 5ac67d5..23b35e5 100644 Binary files a/cards/web/thumb/branches-04.jpg and b/cards/web/thumb/branches-04.jpg differ diff --git a/cards/web/thumb/branches-05.jpg b/cards/web/thumb/branches-05.jpg index 5afb77d..4689fc5 100644 Binary files a/cards/web/thumb/branches-05.jpg and b/cards/web/thumb/branches-05.jpg differ diff --git a/cards/web/thumb/branches-06.jpg b/cards/web/thumb/branches-06.jpg index 6387d74..b267bbc 100644 Binary files a/cards/web/thumb/branches-06.jpg and b/cards/web/thumb/branches-06.jpg differ diff --git a/cards/web/thumb/branches-07.jpg b/cards/web/thumb/branches-07.jpg index cd33462..562432a 100644 Binary files a/cards/web/thumb/branches-07.jpg and b/cards/web/thumb/branches-07.jpg differ diff --git a/cards/web/thumb/branches-08.jpg b/cards/web/thumb/branches-08.jpg index 5a9c34f..e0d2481 100644 Binary files a/cards/web/thumb/branches-08.jpg and b/cards/web/thumb/branches-08.jpg differ diff --git a/cards/web/thumb/branches-09.jpg b/cards/web/thumb/branches-09.jpg index 042ba7e..10495a5 100644 Binary files a/cards/web/thumb/branches-09.jpg and b/cards/web/thumb/branches-09.jpg differ diff --git a/cards/web/thumb/branches-10.jpg b/cards/web/thumb/branches-10.jpg index 202a77a..a5643cd 100644 Binary files a/cards/web/thumb/branches-10.jpg and b/cards/web/thumb/branches-10.jpg differ diff --git a/cards/web/thumb/branches-11.jpg b/cards/web/thumb/branches-11.jpg index 7be1676..871ae6d 100644 Binary files a/cards/web/thumb/branches-11.jpg and b/cards/web/thumb/branches-11.jpg differ diff --git a/cards/web/thumb/branches-12.jpg b/cards/web/thumb/branches-12.jpg index 8737137..9109721 100644 Binary files a/cards/web/thumb/branches-12.jpg and b/cards/web/thumb/branches-12.jpg differ diff --git a/cards/web/thumb/roots-01.jpg b/cards/web/thumb/roots-01.jpg index 68f5267..af52776 100644 Binary files a/cards/web/thumb/roots-01.jpg and b/cards/web/thumb/roots-01.jpg differ diff --git a/cards/web/thumb/roots-02.jpg b/cards/web/thumb/roots-02.jpg index b6a6cdd..1b78269 100644 Binary files a/cards/web/thumb/roots-02.jpg and b/cards/web/thumb/roots-02.jpg differ diff --git a/cards/web/thumb/roots-03.jpg b/cards/web/thumb/roots-03.jpg index 6a1cbeb..6e871ff 100644 Binary files a/cards/web/thumb/roots-03.jpg and b/cards/web/thumb/roots-03.jpg differ diff --git a/cards/web/thumb/roots-04.jpg b/cards/web/thumb/roots-04.jpg index e6baa74..260958c 100644 Binary files a/cards/web/thumb/roots-04.jpg and b/cards/web/thumb/roots-04.jpg differ diff --git a/cards/web/thumb/roots-05.jpg b/cards/web/thumb/roots-05.jpg index 10aa650..05950c9 100644 Binary files a/cards/web/thumb/roots-05.jpg and b/cards/web/thumb/roots-05.jpg differ diff --git a/cards/web/thumb/roots-06.jpg b/cards/web/thumb/roots-06.jpg index 1deeb5c..445e75a 100644 Binary files a/cards/web/thumb/roots-06.jpg and b/cards/web/thumb/roots-06.jpg differ diff --git a/cards/web/thumb/roots-07.jpg b/cards/web/thumb/roots-07.jpg index 6127870..03c34a6 100644 Binary files a/cards/web/thumb/roots-07.jpg and b/cards/web/thumb/roots-07.jpg differ diff --git a/cards/web/thumb/roots-08.jpg b/cards/web/thumb/roots-08.jpg index 4335195..d2e0183 100644 Binary files a/cards/web/thumb/roots-08.jpg and b/cards/web/thumb/roots-08.jpg differ diff --git a/cards/web/thumb/roots-09.jpg b/cards/web/thumb/roots-09.jpg index 6c8cb3f..77768f8 100644 Binary files a/cards/web/thumb/roots-09.jpg and b/cards/web/thumb/roots-09.jpg differ diff --git a/cards/web/thumb/roots-10.jpg b/cards/web/thumb/roots-10.jpg index 8119af2..608b88a 100644 Binary files a/cards/web/thumb/roots-10.jpg and b/cards/web/thumb/roots-10.jpg differ diff --git a/cards/web/thumb/roots-11.jpg b/cards/web/thumb/roots-11.jpg index 5e2c44c..badd896 100644 Binary files a/cards/web/thumb/roots-11.jpg and b/cards/web/thumb/roots-11.jpg differ diff --git a/cards/web/thumb/roots-12.jpg b/cards/web/thumb/roots-12.jpg index f31c57f..7fae120 100644 Binary files a/cards/web/thumb/roots-12.jpg and b/cards/web/thumb/roots-12.jpg differ diff --git a/cards/web/thumb/shell-01.jpg b/cards/web/thumb/shell-01.jpg index 8bb5576..87f2aa7 100644 Binary files a/cards/web/thumb/shell-01.jpg and b/cards/web/thumb/shell-01.jpg differ diff --git a/cards/web/thumb/shell-02.jpg b/cards/web/thumb/shell-02.jpg index 187430c..dad26fc 100644 Binary files a/cards/web/thumb/shell-02.jpg and b/cards/web/thumb/shell-02.jpg differ diff --git a/cards/web/thumb/shell-03.jpg b/cards/web/thumb/shell-03.jpg index afdc6a9..9804bb0 100644 Binary files a/cards/web/thumb/shell-03.jpg and b/cards/web/thumb/shell-03.jpg differ diff --git a/cards/web/thumb/shell-04.jpg b/cards/web/thumb/shell-04.jpg index 0fa42dd..c5200e1 100644 Binary files a/cards/web/thumb/shell-04.jpg and b/cards/web/thumb/shell-04.jpg differ diff --git a/cards/web/thumb/shell-05.jpg b/cards/web/thumb/shell-05.jpg index 58ea747..4572a58 100644 Binary files a/cards/web/thumb/shell-05.jpg and b/cards/web/thumb/shell-05.jpg differ diff --git a/cards/web/thumb/shell-06.jpg b/cards/web/thumb/shell-06.jpg index 36671b8..490f6fa 100644 Binary files a/cards/web/thumb/shell-06.jpg and b/cards/web/thumb/shell-06.jpg differ diff --git a/cards/web/thumb/shell-07.jpg b/cards/web/thumb/shell-07.jpg index 4cefb29..f72e48e 100644 Binary files a/cards/web/thumb/shell-07.jpg and b/cards/web/thumb/shell-07.jpg differ diff --git a/cards/web/thumb/shell-08.jpg b/cards/web/thumb/shell-08.jpg index e26d39c..45c1259 100644 Binary files a/cards/web/thumb/shell-08.jpg and b/cards/web/thumb/shell-08.jpg differ diff --git a/cards/web/thumb/shell-09.jpg b/cards/web/thumb/shell-09.jpg index 8382306..1a16a1b 100644 Binary files a/cards/web/thumb/shell-09.jpg and b/cards/web/thumb/shell-09.jpg differ diff --git a/cards/web/thumb/shell-10.jpg b/cards/web/thumb/shell-10.jpg index e26263e..89e15e5 100644 Binary files a/cards/web/thumb/shell-10.jpg and b/cards/web/thumb/shell-10.jpg differ diff --git a/cards/web/thumb/shell-11.jpg b/cards/web/thumb/shell-11.jpg index 8ffd56a..13a735d 100644 Binary files a/cards/web/thumb/shell-11.jpg and b/cards/web/thumb/shell-11.jpg differ diff --git a/cards/web/thumb/shell-12.jpg b/cards/web/thumb/shell-12.jpg index 175e40e..86c59ce 100644 Binary files a/cards/web/thumb/shell-12.jpg and b/cards/web/thumb/shell-12.jpg differ diff --git a/cards/web/thumb/trunk-01.jpg b/cards/web/thumb/trunk-01.jpg index 5967869..8197896 100644 Binary files a/cards/web/thumb/trunk-01.jpg and b/cards/web/thumb/trunk-01.jpg differ diff --git a/cards/web/thumb/trunk-02.jpg b/cards/web/thumb/trunk-02.jpg index 3a19b78..dc36986 100644 Binary files a/cards/web/thumb/trunk-02.jpg and b/cards/web/thumb/trunk-02.jpg differ diff --git a/cards/web/thumb/trunk-03.jpg b/cards/web/thumb/trunk-03.jpg index c3b705d..b38dbcb 100644 Binary files a/cards/web/thumb/trunk-03.jpg and b/cards/web/thumb/trunk-03.jpg differ diff --git a/cards/web/thumb/trunk-04.jpg b/cards/web/thumb/trunk-04.jpg index 953243d..a70e30d 100644 Binary files a/cards/web/thumb/trunk-04.jpg and b/cards/web/thumb/trunk-04.jpg differ diff --git a/cards/web/thumb/trunk-05.jpg b/cards/web/thumb/trunk-05.jpg index 2dbca96..827c124 100644 Binary files a/cards/web/thumb/trunk-05.jpg and b/cards/web/thumb/trunk-05.jpg differ diff --git a/cards/web/thumb/trunk-06.jpg b/cards/web/thumb/trunk-06.jpg index f8e7d0f..f171ac5 100644 Binary files a/cards/web/thumb/trunk-06.jpg and b/cards/web/thumb/trunk-06.jpg differ diff --git a/cards/web/thumb/trunk-07.jpg b/cards/web/thumb/trunk-07.jpg index 1479542..1881c40 100644 Binary files a/cards/web/thumb/trunk-07.jpg and b/cards/web/thumb/trunk-07.jpg differ diff --git a/cards/web/thumb/trunk-08.jpg b/cards/web/thumb/trunk-08.jpg index 536b17a..f069aae 100644 Binary files a/cards/web/thumb/trunk-08.jpg and b/cards/web/thumb/trunk-08.jpg differ diff --git a/cards/web/thumb/trunk-09.jpg b/cards/web/thumb/trunk-09.jpg index c15597a..1458692 100644 Binary files a/cards/web/thumb/trunk-09.jpg and b/cards/web/thumb/trunk-09.jpg differ diff --git a/cards/web/thumb/trunk-10.jpg b/cards/web/thumb/trunk-10.jpg index 5e7bcf3..f2de957 100644 Binary files a/cards/web/thumb/trunk-10.jpg and b/cards/web/thumb/trunk-10.jpg differ diff --git a/cards/web/thumb/trunk-11.jpg b/cards/web/thumb/trunk-11.jpg index 29c1a97..6fb2c46 100644 Binary files a/cards/web/thumb/trunk-11.jpg and b/cards/web/thumb/trunk-11.jpg differ diff --git a/cards/web/thumb/trunk-12.jpg b/cards/web/thumb/trunk-12.jpg index 3e7a1fb..87644d5 100644 Binary files a/cards/web/thumb/trunk-12.jpg and b/cards/web/thumb/trunk-12.jpg differ diff --git a/data/cards.json b/data/cards.json index c6d1561..bdeb88d 100644 --- a/data/cards.json +++ b/data/cards.json @@ -37,7 +37,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "A vast ancient turtle beneath the desert floor, a great tree growing from cracks in its shell — roots reaching into the dark below, branches into a field of stars above.", + "image_prompt": "An immense ancient turtle seen from the side, so vast that its shell IS the desert floor — mesas and a lone cactus stand on its back, and the World Tree grows straight up from the crown of the shell. The turtle's head is lowered and its jaws are closed, with quiet finality, on one single taut root. Everything else about the creature is patient and still; only the bite is decisive. Deep carved strata beneath it.", "image_file": "cards/art/shell-01.png" }, { @@ -61,7 +61,7 @@ "confidence": "high" }, "live_hook": "the-man", - "image_prompt": "A towering cedar-tree effigy with a double-helix of spiral staircases winding up and down its trunk, glowing against the night, ready to burn.", + "image_prompt": "A colossal wooden effigy of a man built as a spiral staircase tower — one half still clean carved timber, the other half already burnt to glowing embers and ash, the two halves meeting down the exact centre line. The spiral stair runs both up into the figure and down into the ground. At its base one small figure stands holding a lit torch in one hand and a watering can in the other, looking up, having not yet chosen.", "image_file": "cards/art/shell-02.png" }, { @@ -85,7 +85,7 @@ "confidence": "high" }, "live_hook": "temple", - "image_prompt": "An enormous wooden flower-shaped temple, slatted petals radiating from a tall central stamen, moonlight pouring through the gaps, one glowing bloom that lasts a single night.", + "image_prompt": "A domed temple open to the night sky, a single enormous night-blooming flower opened wide at its centre and lit gold from within. Figures file out through the doorway with empty hands, having left small objects on the shelves — and one figure has made a bed of blankets among the offerings and lies asleep there, settled in, while everyone else leaves. The flower is fully open and will close by morning.", "image_file": "cards/art/shell-03.png" }, { @@ -109,7 +109,7 @@ "confidence": "high" }, "live_hook": "art:resonant-spire", - "image_prompt": "A tall slender wooden spire on the open playa at night, human voices visualized as ribbons of light and sound spiraling up its length.", + "image_prompt": "A tall slender wooden tower of stacked rings. One figure at its base speaks quietly into an opening at the bottom, and the tower carries it upward as widening bands of gold light that leave the top and cross the whole sky. Beside the tower a second figure shouts through an enormous horn, straining, and it produces only a thick plume of dust that hangs in the air and falls back down.", "image_file": "cards/art/shell-04.png" }, { @@ -133,7 +133,7 @@ "confidence": "high" }, "live_hook": "art:yggdrasil", - "image_prompt": "A massive World Tree woven from pale bamboo, roots and canopy equally vast, tiny offerings tucked into its base.", + "image_prompt": "An immense tree of bound bamboo. Below the ground line its roots do not end in soil — they end in hundreds of small open human hands holding them up, ranks of them receding into the dark. In the hollow between two great roots a figure sits comfortably, leaning back, sheltered. Beside them, forgotten, a single small sapling stands in a tin can, its roots dry and exposed, never planted.", "image_file": "cards/art/shell-05.png" }, { @@ -157,7 +157,7 @@ "confidence": "high" }, "live_hook": "place:trash-fence", - "image_prompt": "A lone figure standing at an orange plastic construction fence at the far edge of a vast empty desert, dust haze on the horizon.", + "image_prompt": "A long low fence of weathered slats running the full width of the card, close to the viewer. A lone figure stands at the fence with both hands on it, back to us, looking through and away toward a distant glittering city on the flat horizon — the fence frames that view like a window. At one end the same fence has been built up into a solid blank wall twice a person's height, with nothing behind it but empty dust.", "image_file": "cards/art/shell-06.png" }, { @@ -181,7 +181,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "The interior of an enormous turtle shell reimagined as a warm domed sanctuary, mismatched people of every kind gathered inside, desert light through the seams.", + "image_prompt": "An enormous turtle shell resting on the playa and propped open like a lid, warm light spilling from inside, mismatched figures sitting close together within it — someone with tools, someone with a pot, someone with an instrument — and at the raised lip a hand reaching down to pull one more traveller up and in. Some distance behind it, a second identical shell sits clamped shut on the dust, with one small silhouette visible inside.", "image_file": "cards/art/shell-07.png" }, { @@ -205,7 +205,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "A turtle-shaped shrine of warm circuitry and candlelight, a screen or crystal at its heart glowing with slow light, a hand reaching toward it.", + "image_prompt": "A seated figure facing a squat carved machine shaped like a turtle, oracle slot at its front. The machine's face is a polished mirror, so the seeker is looking directly at their own reflection. A printed slip has emerged from the slot and it is completely blank. The seeker's own hand has stopped halfway to it. The scene is calm, not sinister.", "image_file": "cards/art/shell-08.png" }, { @@ -229,7 +229,7 @@ "confidence": "high" }, "live_hook": "artcar:el-pulpo", - "image_prompt": "A giant rusted scrap-metal octopus on wheels, eight tentacles shooting jets of fire into the night sky over a crowd of dancers.", + "image_prompt": "A towering octopus welded from scrap metal, fire pouring from two of its raised arms, a ring of small figures gathered close with their hands out to the warmth. From this angle one lowered tentacle is open along its underside, showing it is hollow — and a single figure stands back there alone, at the exact spot where that hollow is the only thing visible.", "image_file": "cards/art/shell-09.png" }, { @@ -253,7 +253,7 @@ "confidence": "high" }, "live_hook": "camp:barbie-death", - "image_prompt": "A gleefully macabre wood-chipper fed with a stream of pink dolls, confetti of plastic limbs, a laughing crowd in a surreal desert theme park.", + "image_prompt": "A figure feeding a flawless smiling mannequin of themselves head-first into a large hand-cranked chipper. What sprays out the far side is not plastic but dark rich earth, already sprouting. Behind them a second figure feeds an identical mannequin into an identical chipper while looking directly out at a ring of raised camera-poles and lit screens, posed, chin lifted.", "image_file": "cards/art/shell-10.png" }, { @@ -277,7 +277,7 @@ "confidence": "high" }, "live_hook": "art:caduceus", - "image_prompt": "A towering steel staff with two serpents spiraling up it, wings at the top, backlit by desert sun — an ancient healing symbol as monument.", + "image_prompt": "An immense steel staff standing upright on the playa, two great serpents coiled around it in opposition, their tension holding it up — remove either and it falls. At its base two figures face each other with clasped hands. On the ground exactly between their feet lies a bared blade, unhidden and plainly visible to both, not buried and not thrown away.", "image_file": "cards/art/shell-11.png" }, { @@ -301,7 +301,7 @@ "confidence": "high" }, "live_hook": "camp:gigsville", - "image_prompt": "A ramshackle, gloriously absurd camp of misfits and pranksters, hand-painted signs, a jester energy, decades of accumulated playful chaos.", + "image_prompt": "A tall hand-built timber archway, its joinery visibly immaculate and precisely fitted, surmounted by a comically enormous carved rubber chicken. Figures in absurd costume — one in a jester's cap, one wearing a traffic cone — work on the joints with real carpentry tools and total concentration. Off to one side a masked figure stands with hands in pockets, laughing, back turned to the work, touching nothing.", "image_file": "cards/art/shell-12.png" }, { @@ -325,7 +325,7 @@ "confidence": "high" }, "live_hook": "art:mebuyan-pulse", - "image_prompt": "A climbable cluster of glowing suspended spheres like a many-breasted constellation, a nurturing underworld deity, figures climbing among them at night.", + "image_prompt": "A deep vertical shaft cut below the ground line, its walls hung with dozens of glowing round spheres like a constellation. A figure climbs up a ladder formed of those spheres toward the opening far above. Lower down, in a hollowed alcove off the shaft, a second figure has made a nest among the spheres and lies curled and comfortable, not climbing.", "image_file": "cards/art/roots-01.png" }, { @@ -349,7 +349,7 @@ "confidence": "high" }, "live_hook": "art:heart-remains", - "image_prompt": "A human-scale glowing ribcage sculpture with a single luminous heart suspended in its center, a person sitting inside it at dusk.", + "image_prompt": "A colossal ribcage standing on the desert floor and built like a small chapel — the ribs are its walls, and a single lamp shaped like a heart hangs at its center on a long chain. One empty chair sits directly beneath the heart. In the near rib a low door stands open, unlatched, with a path of stones leading out of it into the dark. The room is tended, not abandoned. Dense subterranean cross-hatching all around.", "image_file": "cards/art/roots-02.png" }, { @@ -373,7 +373,7 @@ "confidence": "high" }, "live_hook": "art:titanic", - "image_prompt": "A colossal ship broken in half and half-buried in the desert as if sinking into the playa, bow tilted to the sky, tiny figures at its base at night.", + "image_prompt": "An enormous ship broken clean in half, its bow sunk deep into cracked playa and still going down. A figure grips a taut rope tied to the sinking half and is being dragged toward it, heels furrowing the dust. To one side another figure has released their rope and stands clear, watching. Further off, a third walks away from a rope still tied to something entirely intact and sitting level on solid ground.", "image_file": "cards/art/roots-03.png" }, { @@ -397,7 +397,7 @@ "confidence": "high" }, "live_hook": "art:behind-closed-eyes", - "image_prompt": "A giant reclining human figure whose skin is carved like a topographic landscape of ridges and valleys, eyes closed, at rest on the desert floor.", + "image_prompt": "A colossal reclining human figure lying on the playa whose body is a topographic landscape — ridges, dry valleys, contour lines. A tiny traveller with a lantern walks across the sleeping giant's chest, mapping it. Down at the giant's feet a small circle of ordinary people sit around a fire that has burned down to embers, faces turned toward the traveller, waiting.", "image_file": "cards/art/roots-04.png" }, { @@ -421,7 +421,7 @@ "confidence": "high" }, "live_hook": "ritual:dust-angel", - "image_prompt": "The imprint of a person's dust angel in pale alkali desert, a figure rising from it covered head to toe in fine white dust, grinning.", + "image_prompt": "A figure lying on their back in the dust sweeping their arms and legs to make a dust angel, chalk-white with alkali, laughing, eyes open. Beside them a second figure lies face-down and motionless, limbs slack, already half drifted over by blown dust.", "image_file": "cards/art/roots-05.png" }, { @@ -445,7 +445,7 @@ "confidence": "med" }, "live_hook": "camp:carcass-wash", - "image_prompt": "A gentle assembly line of many soapy hands washing a single trusting stranger passing through, warm and reverent rather than sexual, desert morning light.", + "image_prompt": "Two facing rows of figures holding cloths and basins form a corridor. A person walks through it with arms outstretched and eyes closed, and around their body is a carved arc of ribbon-work like a heraldic shield — clearly drawn, enclosing them, a spoken boundary made visible. Behind them a second person walks the same corridor with no arc at all, head down, arms hanging.", "image_file": "cards/art/roots-06.png" }, { @@ -469,7 +469,7 @@ "confidence": "high" }, "live_hook": "camp:zendo", - "image_prompt": "A soft, dim, cushioned tent of calm, one person gently sitting with another who is having a hard time, warm lantern light, total safety.", + "image_prompt": "The interior of a low domed tent, warm and dim. Two figures sit cross-legged on the ground facing each other, one holding the other's hands while they weather something hard. Just outside the doorway a third figure stands holding a folded blanket, facing in, ready — and directly behind that figure their own dark doorway stands open, unentered, with nothing coming out of it.", "image_file": "cards/art/roots-07.png" }, { @@ -493,7 +493,7 @@ "confidence": "high" }, "live_hook": "deep-playa", - "image_prompt": "A tiny solitary figure walking into an immense black emptiness, distant art lights like far galaxies, a dome of stars overhead.", + "image_prompt": "A lone small figure walking away from the viewer into an enormous dark emptiness, the lights of the distant city glittering far behind them. A single unbroken line of their own footprints runs back from their heels toward those lights. Much further out, a second figure walks in the same direction with no footprints behind them at all.", "image_file": "cards/art/roots-08.png" }, { @@ -517,7 +517,7 @@ "confidence": "high" }, "live_hook": "artcar:mayan-warrior", - "image_prompt": "A sleek Mayan-spaceship art car glowing with lasers and sacred geometry, rising from an implied fire, sound and light pouring off it at night.", + "image_prompt": "An ornate vehicle standing on the playa, its left half a charred blackened wreck and its right half newly rebuilt in bright worked metal, luminous — figures on ladders work along the seam with tools, mid-repair. Some distance away a lone figure sits on an upturned crate facing an untouched burnt hulk, hands empty in their lap, waiting.", "image_file": "cards/art/roots-09.png" }, { @@ -541,7 +541,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "Dry cracked ridges being terraced by hand to catch water, the first green shoots of native grass returning, a turtle watching patiently.", + "image_prompt": "A slope below the ground line cut into a staircase of curved water terraces. On one terrace a kneeling figure pours water from a can onto a small green shoot pushing through the dust. On the terrace directly beside it a shrivelled seedling has died, and a full watering can sits beside it on its side, a skin of dust across the top.", "image_file": "cards/art/roots-10.png" }, { @@ -565,7 +565,7 @@ "confidence": "high" }, "live_hook": "workshop:wellness", - "image_prompt": "Rows of people lying still under a shade sail while a facilitator plays large singing bowls, visible sound waves rippling the heat, deep calm.", + "image_prompt": "A figure lying beneath a canopy of suspended metal singing bowls, gold ripples spreading in rings down over their body, which is drawn as worn ground marked with old scars and seams. At the edge of the frame a second figure lies walled in by bowls stacked into a fortress around them — and just outside that wall, out of reach, a heavy pack and a shovel wait in the dust.", "image_file": "cards/art/roots-11.png" }, { @@ -589,7 +589,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "An artist's studio improbably thriving in the middle of empty white desert — easels, welding sparks, code on a screen — emptiness turned fertile.", + "image_prompt": "A figure kneels on bare cracked playa scoring an enormous intricate radiating design into the dust with a single stick; the pattern spreads out around them and is beautiful and clearly temporary. Behind them, on the same empty ground, a second figure has built a small tidy permanent cottage with a picket fence and a mailbox, and stands at the gate with their arms folded.", "image_file": "cards/art/roots-12.png" }, { @@ -613,7 +613,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "A calm, ancient snapping turtle mid-motion — unhurried body, jaws decisively closing — patience and bite in one image.", + "image_prompt": "A great turtle mid-stride across the flat playa, moving with visible slowness, its jaws closed hard and final on one single taut rope that runs off the edge of the frame. Behind it on the same ground sits a second turtle fully retracted, shell sealed shut, dust drifted high against its sides, clearly unmoved for a long time.", "image_file": "cards/art/trunk-01.png" }, { @@ -637,7 +637,7 @@ "confidence": "high" }, "live_hook": "sunrise_soundcamp", - "image_prompt": "A double-decker bus with a huge glowing red heart, silhouetted dancers on the dunes around it, the first band of sunrise cracking the horizon.", + "image_prompt": "A crowd standing along a low horizon facing a rising sun, faces lit gold, one figure among them with head tilted back having arrived exactly in time. To one side, propped upright against a stack of speakers, another figure sleeps standing with their chin on their chest, facing away from the sunrise entirely.", "image_file": "cards/art/trunk-02.png" }, { @@ -661,7 +661,7 @@ "confidence": "high" }, "live_hook": "art:pulse", - "image_prompt": "A large stone-like heart sculpture riven with glowing cracks, light pulsing out in a slow heartbeat rhythm against the dark.", + "image_prompt": "An enormous heart of riveted metal standing on the playa, cracked through from top to base, gold light pouring out of every fracture. A figure stands in that light with arms open. Another sits on the ground with their back against the heart in its shadow, hands held up to a single crack for warmth, not moving.", "image_file": "cards/art/trunk-03.png" }, { @@ -685,7 +685,7 @@ "confidence": "high" }, "live_hook": "ritual:howl", - "image_prompt": "A crowd of silhouettes on the open playa throwing their heads back to howl as the sun touches the mountains, dust glowing gold.", + "image_prompt": "A line of figures in silhouette along a flat horizon, heads thrown back, mouths open. Their sound is carved as thick radiating rays that fill the entire upper sky like a sunburst — the noise and the sunrise are the same thing. At the exact center of the line one figure stands with head level and mouth closed, hands open at their sides, simply present. A grounded horizon line runs the full width.", "image_file": "cards/art/trunk-04.png" }, { @@ -709,7 +709,7 @@ "confidence": "high" }, "live_hook": "place:center-camp", - "image_prompt": "A vast circular shade canopy full of mismatched couches, performers, and resting strangers, dusty light beams cutting through the interior.", + "image_prompt": "A great tented pavilion at the meeting point of wide roads that converge from every edge of the frame, small figures streaming inward along all of them. One figure walks steadily in toward the pavilion. Another walks a tight closed ring around it, and their path has worn a deep visible rut in the dust from going round so many times.", "image_file": "cards/art/trunk-05.png" }, { @@ -733,7 +733,7 @@ "confidence": "high" }, "live_hook": "place:playa-info", - "image_prompt": "A humble information kiosk and a khaki-clad ranger with a warm, unhurried demeanor helping a lost dusty traveler read a city map.", + "image_prompt": "A weathered wooden information kiosk. A ranger leans on the counter with one arm outstretched, pointing away toward the open playa rather than at a map. One traveller is already walking off along that line. At the counter another traveller stands holding a thick fan of written question-slips, handing over yet another.", "image_file": "cards/art/trunk-06.png" }, { @@ -757,7 +757,7 @@ "confidence": "high" }, "live_hook": "principle:lnt", - "image_prompt": "A single hand plucking a tiny scrap of glitter from the pale desert floor, the vast clean playa stretching out spotless behind it.", + "image_prompt": "A figure crouched alone on an immense empty stretch of clean playa, pinching one tiny scrap of debris from the dust, no one anywhere near them. In the middle distance a second figure sweeps an already spotless square of ground with great concentration, and beside that figure a full set of untouched tools and raw materials sits in a neat unopened stack.", "image_file": "cards/art/trunk-07.png" }, { @@ -781,7 +781,7 @@ "confidence": "high" }, "live_hook": "art:queen", - "image_prompt": "A monumental sculpture of a serene reclining midlife woman, unbothered and regal, resting in the open desert like a mountain.", + "image_prompt": "A figure sitting in a plain folding camp chair on flat open playa doing nothing in particular, ordinary and unposed — and a broad carved sunburst of gold light falls across them anyway, treating them as worth looking at. Nearby, a second figure reclines on an ornate throne with lamps on poles aimed at themselves, arranged in a posture of rest.", "image_file": "cards/art/trunk-08.png" }, { @@ -805,7 +805,7 @@ "confidence": "high" }, "live_hook": "weather:whiteout", - "image_prompt": "Two goggled figures holding hands, seated calmly in a total white dust storm that has erased the world around them into blank light.", + "image_prompt": "Two figures sitting together on the ground holding hands, heads bowed, enclosed on all sides by a churning wall of white dust. At one edge of the frame that wall simply ends: clear air, a clean horizon, open sun — and a third figure sits there under a pulled-down tarp with their hood up and their back to all that light.", "image_file": "cards/art/trunk-09.png" }, { @@ -829,7 +829,7 @@ "confidence": "high" }, "live_hook": "camp:consent", - "image_prompt": "A doorway with clear painted rules and a warm attendant, two people practicing a spoken yes-and-no at the threshold, dignity and play.", + "image_prompt": "Two figures facing each other, one holding out an open hand in offering, the other with palm raised flat in a clear refusal. Between them a single clean gold line is drawn across the ground. The offering figure has inclined their head, accepting it. Behind them a third figure strides across an identical gold line without looking down at it.", "image_file": "cards/art/trunk-10.png" }, { @@ -853,7 +853,7 @@ "confidence": "high" }, "live_hook": "principle:self-reliance", - "image_prompt": "A well-prepared lone traveler on a dusty bike, water and gear neatly stowed, self-sufficient and calm under a huge sky.", + "image_prompt": "A well-provisioned traveller stands on the playa with water bottles and gear neatly stowed, holding out a full canteen to a stranger. Beside them a second figure walks bent almost double beneath an enormous overloaded pack, mouth cracked and dry, passing an offered canteen held out by another hand without turning their head toward it.", "image_file": "cards/art/trunk-11.png" }, { @@ -877,7 +877,7 @@ "confidence": "high" }, "live_hook": "camp:tea-house", - "image_prompt": "A hushed cushioned tent lit by warm lanterns, steam rising from small cups, a few strangers in unhurried silent ceremony.", + "image_prompt": "A small open-sided tea structure. One figure sits upright at a low table with a single cup, hands still, eyes open, entirely present. Behind them in the same structure a second figure lies sprawled among a dozen scattered cups with the canvas walls pulled closed and eyes shut, the lit city visible through the one remaining gap.", "image_file": "cards/art/trunk-12.png" }, { @@ -901,7 +901,7 @@ "confidence": "high" }, "live_hook": "art:above-and-below", - "image_prompt": "A soaring treehouse structure linked by a twisting beanstalk climber, a person at the top reaching skyward, roots implied deep below.", + "image_prompt": "A single tree standing on the vertical axis, its canopy above the ground line and its root mass below mirroring it exactly in size and spread. To one side a slender sapling with a shallow root plate is tipping over sideways in the wind, half lifted out of the dust. To the other side a broad cut stump sits above an enormous root system, rotting, with nothing growing from it.", "image_file": "cards/art/branches-01.png" }, { @@ -925,7 +925,7 @@ "confidence": "high" }, "live_hook": "art:seven-sisters", - "image_prompt": "Seven tall illuminated star-sculptures clustered like the Pleiades, a person lying beneath them gazing up at the matching real stars.", + "image_prompt": "Seven bright stars in the upper sky, each joined by a fine gold thread down to a small figure standing alone far apart from the others on the flat playa, every one of them looking up. The nearest figure holds their thread. Behind that figure, on the ground, a small dark doorway stands shut with a slack unheld thread running toward it, and they have turned their back to it.", "image_file": "cards/art/branches-02.png" }, { @@ -949,7 +949,7 @@ "confidence": "high" }, "live_hook": "principle:gifting", - "image_prompt": "An open hand offering a small handmade treasure to a stranger in the dust, both faces lit with unforced delight.", + "image_prompt": "A traveller in the foreground has just set a small handmade object down on a flat stone cairn and is already walking away, back turned, head down, not looking at it — their hands are empty and open at their sides. Far behind them, small and brightly lit on a distant stage, another figure holds an identical object high above their head toward a crowd of raised arms. The near figure is large, quiet and unlit; the distant one is tiny, radiant and surrounded. The cairn stands on the vertical axis of the card.", "image_file": "cards/art/branches-03.png" }, { @@ -973,7 +973,7 @@ "confidence": "high" }, "live_hook": "ritual:playa-name", - "image_prompt": "A hand-painted name tag being pinned onto a delighted, surprised person by a circle of new friends around a fire.", + "image_prompt": "Two figures facing each other. One presses a small carved wooden name-token into the open palms of the other, who stands relaxed and entirely recognisable as themselves. Beside them a third figure stands hung all over with dozens of name-tokens on strings, so many that their face and body are completely obscured by them.", "image_file": "cards/art/branches-04.png" }, { @@ -997,7 +997,7 @@ "confidence": "high" }, "live_hook": "ritual:greeters", - "image_prompt": "A greeter flinging arms wide to embrace a dusty first-timer stepping out of a car at the gate, pure unconditional welcome.", + "image_prompt": "Two dust-covered figures meeting in a full embrace, their arms and bent backs forming a clean archway between them. Through that arch, a road runs to the horizon, and a line of small travellers is already walking through the opening the two of them make. The embrace is the gate. Airy negative space above, a scatter of small carved stars.", "image_file": "cards/art/branches-05.png" }, { @@ -1021,7 +1021,7 @@ "confidence": "high" }, "live_hook": "camp:soulmate-outlet", - "image_prompt": "A deadpan mock warehouse-store aisle with a 'SOULMATES' sign, volunteer associates interviewing hopeful dusty applicants on clipboards.", + "image_prompt": "An open market aisle of rough shelving on the playa. One figure stands in it plainly, empty-handed, arms at their sides, easy to see — and a passing stranger has stopped mid-step and turned toward them. Further along the aisle another figure stands behind a long table covered end to end with their entire life laid out in labelled objects, and the crowd flows past without slowing.", "image_file": "cards/art/branches-06.png" }, { @@ -1045,7 +1045,7 @@ "confidence": "high" }, "live_hook": "camp:ashram-galactica", - "image_prompt": "White-gloved bellhops rolling out a red carpet in the dust for a filthy, grinning traveler, a gilded champagne bar glinting behind them.", + "image_prompt": "A dust-caked traveller seated in a velvet armchair on the open playa, being poured tea by an attendant in a crisp uniform with a folded towel over one arm. Beside them a second attendant serves another guest while balancing a tall stack of towels — and directly behind that attendant sits an identical empty velvet armchair with their own name lettered on a small card, never sat in.", "image_file": "cards/art/branches-07.png" }, { @@ -1069,7 +1069,7 @@ "confidence": "high" }, "live_hook": "sunrise_soundcamp", - "image_prompt": "A cathedral-scale dance stage crowned by a great sphere, towering columns of fire erupting on the beat over an ecstatic crowd at night.", + "image_prompt": "A temple-like structure of speakers and carved arches. The dancing crowd before it is drawn as one rising flame, arms up, bodies merging into the shape of fire, and at its heart a single figure is dissolving into light. At the far outer edge one figure dances alone with eyes shut and face turned away from the crowd, and behind them a plain door stands open onto empty dark.", "image_file": "cards/art/branches-08.png" }, { @@ -1093,7 +1093,7 @@ "confidence": "high" }, "live_hook": "daytime_soundcamp", - "image_prompt": "A packed open-air daytime dancefloor blazing under the desert sun, thousands moving together in dust and joy, no night required.", + "image_prompt": "A daylight crowd dancing in full hard sun and thick dust, arms raised, faces turned toward one another and open. In the middle of them one figure dances with their arms up the same as everyone else but their face turned away from every other face, and a clean circle of empty ground surrounds their feet that no one steps into.", "image_file": "cards/art/branches-09.png" }, { @@ -1117,7 +1117,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "Lines of glowing code blooming off a screen into a spray of painterly color and light, a maker delighted at the overlap of machine and art.", + "image_prompt": "A workbench where circuit boards, wire and salvaged components grow upward and flower into an intricate blossoming structure reaching into the sky — clearly useless, clearly beautiful — with its maker standing back looking up at it. Beside them a second figure sits entirely enclosed inside a dense lattice cage woven from their own wiring, still working, with a blank unwritten page resting untouched on their knee.", "image_file": "cards/art/branches-10.png" }, { @@ -1141,7 +1141,7 @@ "confidence": "high" }, "live_hook": "camp:terrible-turtle", - "image_prompt": "A joyfully inexplicable homemade contraption glowing in the desert night, its maker beaming beside it, one curious stranger approaching.", + "image_prompt": "A figure standing proudly beside an absurd inexplicable machine they have built out of salvage — and the machine's silhouette unmistakably echoes the shape of their own body and face. Beside them another figure wears an elaborate outlandish mask and stands next to nothing at all, hands empty at their sides.", "image_file": "cards/art/branches-11.png" }, { @@ -1165,8 +1165,8 @@ "confidence": "high" }, "live_hook": "art:headwaters", - "image_prompt": "A spiraling bamboo labyrinth on the open playa modeled on a sacred mountain, a single pilgrim walking its winding path toward the center.", + "image_prompt": "An enormous labyrinth scored into the playa in concentric rings. One figure is deep inside it, close to the centre, carrying a small object to set down. Out on the furthest ring another figure walks the outer circuit, which they have worn into a deep smooth track, passing the labyrinth's entrance again without turning in.", "image_file": "cards/art/branches-12.png" } ] -} \ No newline at end of file +} diff --git a/print/booklet.pdf b/print/booklet.pdf index 25b7399..199fbd3 100644 Binary files a/print/booklet.pdf and b/print/booklet.pdf differ diff --git a/print/proof.pdf b/print/proof.pdf index 3cecf7a..106d778 100644 Binary files a/print/proof.pdf and b/print/proof.pdf differ diff --git a/tools/booklet.py b/tools/booklet.py index 210d78f..df1ba46 100644 --- a/tools/booklet.py +++ b/tools/booklet.py @@ -2,8 +2,17 @@ from PIL import Image, ImageDraw, ImageFont import json, os -REPO = "/Users/parachute/Code/oracle-ai" +import os +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ART = f"{REPO}/cards/art" + + +def art_src(cid): + # .png masters are local-only (gitignored); the committed archive is q95 .jpg + p = f"{ART}/{cid}.png" + return p if os.path.exists(p) else f"{ART}/{cid}.jpg" + + d = json.load(open(f"{REPO}/data/cards.json")) playa = json.load(open(f"{REPO}/data/playa_2026.json"))["hooks"] order = {"shell": 0, "roots": 1, "trunk": 2, "branches": 3} @@ -73,7 +82,7 @@ def card_block(dr, c, x, y, h): tint = REALM_TINT[c["realm"]] tw = 300; th = int(tw * 1.5) try: - im = Image.open(f"{ART}/{c['id']}.png").convert("RGB").resize((tw, th)) + im = Image.open(art_src(c["id"])).convert("RGB").resize((tw, th)) dr._image.paste(im, (x, y)) except Exception: dr.rectangle([x, y, x + tw, y + th], outline=tint, width=2) diff --git a/tools/contact_sheet.py b/tools/contact_sheet.py index 771f719..2d1be9c 100644 --- a/tools/contact_sheet.py +++ b/tools/contact_sheet.py @@ -1,7 +1,8 @@ from PIL import Image, ImageDraw, ImageFont import json, os -REPO = "/Users/parachute/Code/oracle-ai" +import os +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) d = json.load(open(f"{REPO}/data/cards.json")) order = {"shell": 0, "roots": 1, "trunk": 2, "branches": 3} cards = sorted(d["cards"], key=lambda c: (order[c["realm"]], c["number"])) @@ -29,7 +30,10 @@ x = PAD + col * (TW + PAD) y = TITLE + r * (TH + LBL + PAD) try: - im = Image.open(f"{REPO}/cards/art/{c['id']}.png").convert("RGB").resize((TW, TH)) + _p = f"{REPO}/cards/art/{c['id']}.png" + if not os.path.exists(_p): + _p = f"{REPO}/cards/art/{c['id']}.jpg" + im = Image.open(_p).convert("RGB").resize((TW, TH)) sheet.paste(im, (x, y)) except Exception: draw.rectangle([x, y, x + TW, y + TH], fill=(70, 40, 40)) diff --git a/tools/gen_art.py b/tools/gen_art.py new file mode 100644 index 0000000..2f0d824 --- /dev/null +++ b/tools/gen_art.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python3 +"""Generate card art through the Codex backend's image_generation tool. + +Why this route: the Codex CLI authenticates a ChatGPT account and talks to +`chatgpt.com/backend-api/codex/responses`, which accepts the `image_generation` +tool. That means no OpenAI API key and no per-image billing — the ChatGPT plan +covers it. The same token gets 401 (missing scopes) against api.openai.com, so +this is the only door. + +The model must be the one Codex itself uses (`gpt-5.6-sol`). Any other name comes +back "not supported when using Codex with a ChatGPT account", which reads like a +model problem and is really an entitlement one. + +Usage: + python3 tools/gen_art.py shell-01 roots-02 # specific cards + python3 tools/gen_art.py --realm shell # a whole realm + python3 tools/gen_art.py --all # the deck + python3 tools/gen_art.py --all --out cards/art2 # somewhere else + +Writes /.png at 1024x1536 (exactly the deck's 2:3), and records the +prompt actually used in /prompts-used.json so a run is reproducible. +""" +import argparse +import base64 +import json +import os +import sys +import time +import urllib.error +import urllib.request + +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +AUTH = os.path.expanduser("~/.codex/auth.json") +URL = "https://chatgpt.com/backend-api/codex/responses" +MODEL = os.environ.get("CODEX_IMAGE_MODEL", "gpt-5.6-sol") + +# docs/STYLE_GUIDE.md — every card prepends this so all 48 read as one deck. +PREAMBLE = ( + "Hand-carved woodblock print / letterpress relief illustration, bold black ink " + "linework with visible carving texture, cross-hatch and stipple shading, printed on " + "warm desert-tan kraft paper with subtle paper grain, sparing metallic gold accents. " + "Flat printed ink — no 3D render, no photography, no gradients, no digital smoothness. " + "Mythic and heraldic. Centered, symmetrical, iconic composition with calm breathing " + "space. Thin double gold border just inside the card edge. A subtle vertical World-Tree " + "axis motif somewhere in the composition — the spine of the deck. " + # Every card is the same place. Without this the model wanders somewhere prettier the + # moment a subject turns abstract — the first draft of The Gift came back with pine + # forests and green valleys, which is a lovely card for a different deck. + "SETTING, ALWAYS AND WITHOUT EXCEPTION: the Black Rock Desert. A dead-flat pale alkali " + "playa stretching to the horizon, cracked dust, distant low barren desert mountains, " + "enormous open sky. NO trees, NO forest, NO pines, NO grass, NO green vegetation, NO " + "rivers or lakes, NO rolling hills — the only tree that may ever appear is the World " + "Tree itself. If the subject implies a landscape, that landscape is still this desert. " +) + +# The undertone is a SECOND spot-colour printed alongside the black and gold — say it that +# way. Naming a colour alone gets ignored: "deep indigo undertone" produced cards +# indistinguishable from the kraft default, while branches' sky-blue happened to survive +# because the subject was already sky. Each realm now states the ink, where it goes, and +# how much of the card it should touch. +REALM_TONE = { + # The Shell twelve are the axis — the rare card the séance now surfaces about one time + # in ten. They should be recognisable across a dusty tent before anyone reads the name, + # so they get a heavier frame and markedly more gold than the three Tree realms. + "shell": ("SECOND INK — metallic gold, used lavishly, far more than any other realm: a " + "full radiant sunburst behind the subject, gilded ornament throughout, gold " + "rules and nodes running the whole axis. THIS REALM'S FRAME IS DIFFERENT AND " + "HEAVIER: an ornate engraved gold border several times the width of a plain " + "rule, with a decorative corner boss at each of the four corners, so the card " + "is identifiable as one of the twelve from across a room. Small carved " + "turtle-shell glyph in a top corner."), + "roots": ("SECOND INK — deep indigo blue, used heavily and unmistakably: the entire " + "lower half of the card below the ground line is printed in dark indigo " + "rather than black, indigo soaking the subterranean cross-hatching, indigo " + "shadow pooling under the subject. The card must read as blue-black, not " + "brown. Downward pull; dense underground detail. Gold only as a small accent. " + "Small carved root-knot glyph in a top corner."), + "trunk": ("SECOND INK — burnt rust-orange ochre, clearly visible: rust in the sky wash, " + "rust in the horizon band, rust warming the midtones. A strong grounded " + "horizon line across the full width. Balanced, upright, weighty. " + "Small carved trunk-ring glyph in a top corner."), + "branches": ("SECOND INK — pale sky blue, clearly visible: blue filling the open sky, " + "blue in the leaves and small carved stars. Upward reach, airy negative " + "space, the lightest of the four. Small carved branch-star glyph in a " + "top corner."), +} + +# No lettering in the generated art: image models misspell, and 48 cards that each +# misspell differently is the fastest way to lose deck cohesion. The title cartouche +# is composited in tools/print_prep.py, where the typography is exact and identical. +NO_TEXT = (" Leave a clean empty banner cartouche across the bottom sixth of the image for " + "a title to be printed later. Absolutely no letters, words, numerals or " + "signatures anywhere in the image.") + + +def auth_headers(): + with open(AUTH) as f: + a = json.load(f) + t = a["tokens"] + return { + "Authorization": f"Bearer {t['access_token']}", + "chatgpt-account-id": t["account_id"], + "Content-Type": "application/json", + "OpenAI-Beta": "responses=experimental", + "originator": "codex_cli_rs", + "session_id": "00000000-0000-0000-0000-0000000000ff", + } + + +def build_prompt(card): + return (PREAMBLE + f"[{card['realm'].upper()} undertone: {REALM_TONE[card['realm']]}] " + + "Subject: " + card["image_prompt"].strip() + NO_TEXT) + + +def generate(prompt, headers, timeout=600): + """Returns PNG bytes, or raises.""" + body = { + "model": MODEL, + "instructions": "You generate images. Call the image_generation tool. Do not ask " + "clarifying questions; produce the image immediately.", + "input": [{"role": "user", "content": [{"type": "input_text", "text": prompt}]}], + "tools": [{"type": "image_generation"}], + "stream": True, + "store": False, + } + req = urllib.request.Request(URL, data=json.dumps(body).encode(), headers=headers) + b64, said = None, [] + with urllib.request.urlopen(req, timeout=timeout) as r: + for raw in r: + line = raw.decode(errors="replace").strip() + if not line.startswith("data:"): + continue + try: + d = json.loads(line[5:].strip()) + except Exception: + continue + if d.get("type", "").startswith("response.image_generation_call") and d.get("result"): + b64 = d["result"] + for k in ("partial_image_b64", "b64_json", "image_b64"): + v = d.get(k) + if isinstance(v, str) and len(v) > 5000: + b64 = v + if d.get("type") == "response.output_text.delta" and d.get("delta"): + said.append(d["delta"]) + if not b64: + raise RuntimeError("no image returned; model said: " + ("".join(said)[:300] or "(nothing)")) + return base64.b64decode(b64) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("ids", nargs="*", help="card ids, e.g. shell-01") + ap.add_argument("--realm", help="generate a whole realm") + ap.add_argument("--all", action="store_true") + ap.add_argument("--out", default="cards/art") + ap.add_argument("--force", action="store_true", help="regenerate even if the file exists") + ap.add_argument("--retries", type=int, default=2) + args = ap.parse_args() + + cards = json.load(open(os.path.join(REPO, "data", "cards.json")))["cards"] + by_id = {c["id"]: c for c in cards} + + if args.all: + todo = cards + elif args.realm: + todo = [c for c in cards if c["realm"] == args.realm] + else: + missing = [i for i in args.ids if i not in by_id] + if missing: + sys.exit(f"unknown card ids: {missing}") + todo = [by_id[i] for i in args.ids] + if not todo: + sys.exit("nothing to generate") + + outdir = os.path.join(REPO, args.out) + os.makedirs(outdir, exist_ok=True) + headers = auth_headers() + used_path = os.path.join(outdir, "prompts-used.json") + used = json.load(open(used_path)) if os.path.exists(used_path) else {} + + ok = fail = skip = 0 + for n, card in enumerate(todo, 1): + dest = os.path.join(outdir, card["id"] + ".png") + if os.path.exists(dest) and not args.force: + print(f"[{n}/{len(todo)}] {card['id']}: exists, skipping") + skip += 1 + continue + prompt = build_prompt(card) + for attempt in range(1, args.retries + 2): + t = time.time() + try: + png = generate(prompt, headers) + with open(dest, "wb") as f: + f.write(png) + # The .png master stays local (gitignored); the committed archive + # is a q95 4:4:4 JPEG — visually lossless at print size. + from PIL import Image + Image.open(dest).convert("RGB").save( + dest[:-4] + ".jpg", "JPEG", + quality=95, optimize=True, subsampling=0) + used[card["id"]] = prompt + with open(used_path, "w") as f: + json.dump(used, f, indent=2) + print(f"[{n}/{len(todo)}] {card['id']}: {len(png)//1024} KB in " + f"{time.time()-t:.0f}s ({card['name']})") + ok += 1 + break + except Exception as e: + msg = str(e)[:160] + if attempt > args.retries: + print(f"[{n}/{len(todo)}] {card['id']}: FAILED — {msg}") + fail += 1 + else: + print(f"[{n}/{len(todo)}] {card['id']}: retry {attempt} — {msg}") + time.sleep(5 * attempt) + + print(f"\ndone: {ok} generated, {skip} skipped, {fail} failed -> {outdir}") + return 1 if fail else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/print_prep.py b/tools/print_prep.py index a5a4bb7..f4205bd 100644 --- a/tools/print_prep.py +++ b/tools/print_prep.py @@ -6,11 +6,18 @@ from PIL import Image, ImageDraw, ImageFont import json, os -REPO = "/Users/parachute/Code/oracle-ai" +import os +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ART = f"{REPO}/cards/art" OUT = f"{REPO}/print" os.makedirs(f"{OUT}/fronts", exist_ok=True) + +def art_src(cid): + # .png masters are local-only (gitignored); the committed archive is q95 .jpg + p = f"{ART}/{cid}.png" + return p if os.path.exists(p) else f"{ART}/{cid}.jpg" + DPI = 300 TRIM = (int(3.5 * DPI), int(5.25 * DPI)) # 1050 x 1575 BLEED = int(0.125 * DPI) # 38 px @@ -35,14 +42,74 @@ def add_bleed(im, b): return canvas -def print_ready(src): +# --- the title cartouche ----------------------------------------------------------- +# The generated art deliberately leaves the bottom banner EMPTY. Image models misspell, +# and 48 cards each misspelling differently would wreck the cohesion the style guide +# exists to protect. So the name is set here instead: one font, one size rule, one +# baseline, identical across the deck. +TITLE_FONTS = [ + "/System/Library/Fonts/Supplemental/Bodoni 72 Smallcaps Book.ttf", # the style guide's face + "/System/Library/Fonts/Supplemental/Baskerville.ttc", + "/System/Library/Fonts/Supplemental/Georgia.ttf", +] +TITLE_Y = 0.888 # baseline centre, as a fraction of card height — inside the banner +TITLE_MAX_W = 0.66 # longest names shrink to fit rather than crowding the frame +TITLE_INK = (38, 28, 14) +TRACKING = 0.14 # letter-spacing, in ems — small caps want air + + +def _title_font(size): + for path in TITLE_FONTS: + try: + return ImageFont.truetype(path, size) + except Exception: + continue + return ImageFont.load_default() + + +def _draw_tracked(draw, text, font, cx, cy, fill, tracking): + """Centre `text` at (cx, cy) with letter-spacing. PIL has no tracking of its own.""" + widths = [draw.textlength(ch, font=font) for ch in text] + gap = font.size * tracking + total = sum(widths) + gap * (len(text) - 1) + x = cx - total / 2 + ascent, descent = font.getmetrics() + y = cy - (ascent - descent) / 2 + for ch, w in zip(text, widths): + draw.text((x, y), ch, font=font, fill=fill) + x += w + gap + + +def set_title(im, name): + """Composite the card name into the empty banner. Returns a new image.""" + im = im.copy() + draw = ImageDraw.Draw(im) + W, H = im.size + size = int(H * 0.030) + font = _title_font(size) + # shrink until it fits the banner's usable width, tracking included + while size > 8: + widths = [draw.textlength(ch, font=font) for ch in name] + total = sum(widths) + font.size * TRACKING * (len(name) - 1) + if total <= W * TITLE_MAX_W: + break + size -= 2 + font = _title_font(size) + _draw_tracked(draw, name, font, W / 2, H * TITLE_Y, TITLE_INK, TRACKING) + return im + + +def print_ready(src, name=None): im = Image.open(src).convert("RGB").resize(TRIM, Image.LANCZOS) + if name: + im = set_title(im, name) return add_bleed(im, BLEED) # --- fronts + back with bleed --- for c in cards: - print_ready(f"{ART}/{c['id']}.png").save(f"{OUT}/fronts/{c['id']}.png", dpi=(DPI, DPI)) + print_ready(art_src(c["id"]), c["name"]).save( + f"{OUT}/fronts/{c['id']}.png", dpi=(DPI, DPI)) print_ready(f"{REPO}/cards/back.png").save(f"{OUT}/back.png", dpi=(DPI, DPI)) # --- proof PDF: one card per page, name caption, for review (not for the printer) --- @@ -65,7 +132,7 @@ def print_ready(src): seq = cards + [{"id": "back", "name": "Card Back (all cards)", "realm": "", "number": 0}] for c in seq: page = Image.new("RGB", (PW, PH), (245, 240, 230)) - src = f"{OUT}/back.png" if c["id"] == "back" else f"{ART}/{c['id']}.png" + src = f"{OUT}/back.png" if c["id"] == "back" else art_src(c["id"]) im = Image.open(src).convert("RGB") tw = PW - 120 th = int(tw * im.size[1] / im.size[0]) diff --git a/tools/webimg.py b/tools/webimg.py index 23e6162..173ad84 100644 --- a/tools/webimg.py +++ b/tools/webimg.py @@ -8,8 +8,12 @@ def save(src, dst, w, q=82): im = Image.open(src).convert("RGB"); h = int(w*im.size[1]/im.size[0]) im.resize((w, h), Image.LANCZOS).save(dst, "JPEG", quality=q, optimize=True) +def art_src(cid): + # .png masters are local-only (gitignored); the committed archive is q95 .jpg + p = f"{ART}/{cid}.png" + return p if os.path.exists(p) else f"{ART}/{cid}.jpg" for c in d["cards"]: - save(f"{ART}/{c['id']}.png", f"{REPO}/cards/web/thumb/{c['id']}.jpg", 300) - save(f"{ART}/{c['id']}.png", f"{REPO}/cards/web/med/{c['id']}.jpg", 900) + save(art_src(c["id"]), f"{REPO}/cards/web/thumb/{c['id']}.jpg", 300) + save(art_src(c["id"]), f"{REPO}/cards/web/med/{c['id']}.jpg", 900) save(f"{REPO}/cards/back.png", f"{REPO}/cards/web/med/back.jpg", 900) print("web images generated")