{
  "name": "Swamp Tarot",
  "version": "1.0.0",
  "author": "Sophie",
  "source": "https://sophieren.com/swamp-tarot/",
  "repo": "https://github.com/sophiejren/sophiesswap",
  "license": "MIT",
  "description": "15 archetypes from the bog. A small public-domain oracle deck — drop it into any app that needs a daily card, a decision aid, or a quiet 'I'm stuck, give me a metaphor' button. Each card has a number, a name, a one-line meaning, a paragraph reading, and an inline SVG illustration so the whole deck stays self-contained.",
  "schema": {
    "card": {
      "number": "Roman numeral string (I, II, ... XV)",
      "key": "short kebab-case id, stable across versions",
      "name": "uppercase display name",
      "meaning": "single-line motto",
      "reading": "one paragraph of guidance, in second person",
      "svg": "self-contained SVG string, 100x100 viewBox, transparent background"
    }
  },
  "usage": {
    "fetch": "const deck = await fetch('https://sophieren.com/swamp-tarot/deck.json').then(r => r.json());",
    "random": "const card = deck.cards[Math.floor(Math.random() * deck.cards.length)];",
    "daily": "const d = new Date(); const seed = d.getFullYear()*1000 + d.getMonth()*40 + d.getDate(); const card = deck.cards[seed % deck.cards.length];",
    "by_key": "const card = deck.cards.find(c => c.key === 'heron');"
  },
  "cards": [
    {
      "number": "I",
      "key": "heron",
      "name": "THE HERON",
      "meaning": "patience that catches",
      "reading": "You are not slow. You are waiting for the fish that the louder ones never see.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#b6ff5b\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M50 78 L50 50\"/><path d=\"M50 50 Q40 35 50 22\"/><circle cx=\"50\" cy=\"20\" r=\"3\" fill=\"#b6ff5b\"/><path d=\"M53 19 L62 17\"/><path d=\"M50 50 Q60 48 65 55\"/><path d=\"M50 50 Q40 48 35 55\"/><path d=\"M40 78 L60 78\"/><path d=\"M50 78 L48 88\"/><path d=\"M50 78 L52 88\"/><path d=\"M30 90 Q50 86 70 90\" stroke=\"#52ffe0\" opacity=\".6\"/></svg>"
    },
    {
      "number": "II",
      "key": "bog",
      "name": "THE BOG",
      "meaning": "the work is heavy on purpose",
      "reading": "Stuck is not the failure. The pull is the muscle. Walk slower, lift higher.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ffd23f\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"50\" cy=\"68\" rx=\"38\" ry=\"14\" fill=\"#1f5238\" stroke=\"none\"/><path d=\"M16 68 Q22 60 30 64 Q38 56 46 62 Q54 54 62 60 Q70 54 78 62 Q84 56 84 68\"/><circle cx=\"32\" cy=\"56\" r=\"2\" fill=\"#ffd23f\"/><circle cx=\"58\" cy=\"48\" r=\"2\" fill=\"#ffd23f\"/><circle cx=\"70\" cy=\"58\" r=\"2\" fill=\"#ffd23f\"/><path d=\"M20 80 Q50 76 80 80\" opacity=\".5\"/></svg>"
    },
    {
      "number": "III",
      "key": "lure",
      "name": "THE LURE",
      "meaning": "bait wears the face of fortune",
      "reading": "The thing that shines may be a hook. Ask who is pulling, not just what glitters.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ff8a3d\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 10 L50 50\"/><circle cx=\"50\" cy=\"50\" r=\"10\" fill=\"#ffd23f\"/><circle cx=\"46\" cy=\"48\" r=\"1.5\" fill=\"#081310\" stroke=\"none\"/><path d=\"M58 56 Q66 56 70 64 Q66 68 58 62\" fill=\"#ff4d8d\" stroke=\"#ff4d8d\"/><path d=\"M50 60 Q50 70 56 72\" stroke=\"#ff4d8d\" stroke-width=\"1.5\"/><path d=\"M40 78 Q50 76 60 78\" stroke=\"#52ffe0\" opacity=\".6\"/></svg>"
    },
    {
      "number": "IV",
      "key": "mirror",
      "name": "THE MIRROR",
      "meaning": "still water sees you",
      "reading": "You came for an answer; you found a face. Look anyway. The face was the answer.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#52ffe0\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"50\" cy=\"55\" rx=\"32\" ry=\"22\" fill=\"#102a20\"/><ellipse cx=\"50\" cy=\"55\" rx=\"32\" ry=\"22\"/><path d=\"M22 50 Q30 45 38 50\" opacity=\".7\"/><path d=\"M44 58 Q52 53 60 58\" opacity=\".7\"/><path d=\"M66 52 Q72 48 78 52\" opacity=\".5\"/><circle cx=\"50\" cy=\"38\" r=\"3\" fill=\"#52ffe0\"/></svg>"
    },
    {
      "number": "V",
      "key": "frog-king",
      "name": "FROG KING",
      "meaning": "claim it",
      "reading": "The throne is a leaf. The crown is a sound. Take both. No one is coming to crown you.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#b6ff5b\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"50\" cy=\"60\" rx=\"26\" ry=\"20\" fill=\"#1f5238\"/><circle cx=\"40\" cy=\"46\" r=\"7\" fill=\"#b6ff5b\"/><circle cx=\"60\" cy=\"46\" r=\"7\" fill=\"#b6ff5b\"/><circle cx=\"40\" cy=\"46\" r=\"2.5\" fill=\"#081310\"/><circle cx=\"60\" cy=\"46\" r=\"2.5\" fill=\"#081310\"/><path d=\"M38 64 Q50 70 62 64\"/><path d=\"M30 35 L35 22 L42 30 L50 18 L58 30 L65 22 L70 35 Z\" fill=\"#ffd23f\" stroke=\"#ffd23f\"/><circle cx=\"50\" cy=\"14\" r=\"2.5\" fill=\"#ff4d8d\"/></svg>"
    },
    {
      "number": "VI",
      "key": "lily",
      "name": "THE LILY",
      "meaning": "the offering that floats",
      "reading": "Give without proof. The lily has no agenda and still everything orbits it.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ff4d8d\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"50\" cy=\"74\" rx=\"34\" ry=\"10\" fill=\"#1f5238\" stroke=\"#1f5238\"/><path d=\"M50 70 Q40 50 30 46 Q40 38 50 52 Q60 38 70 46 Q60 50 50 70\" fill=\"#ff4d8d\" opacity=\".4\"/><path d=\"M50 70 Q42 54 36 52 Q44 44 50 56 Q56 44 64 52 Q58 54 50 70\" fill=\"#ffd23f\" opacity=\".5\"/><circle cx=\"50\" cy=\"58\" r=\"3\" fill=\"#ffd23f\"/><path d=\"M20 80 Q50 76 80 80\" stroke=\"#52ffe0\" opacity=\".5\"/></svg>"
    },
    {
      "number": "VII",
      "key": "fog",
      "name": "THE FOG",
      "meaning": "you cannot see; that is the answer",
      "reading": "Stop deciding. The fog will lift in its own hour. Until then, breathe shallow and stand still.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#86a596\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 38 Q24 32 34 38 Q44 30 56 36 Q66 30 78 36 Q86 30 90 38\" opacity=\".7\"/><path d=\"M14 54 Q26 48 38 54 Q48 46 60 52 Q72 46 86 54\" opacity=\".85\"/><path d=\"M10 70 Q24 62 38 70 Q52 62 66 70 Q80 64 90 70\"/><circle cx=\"78\" cy=\"22\" r=\"6\" fill=\"#ffd23f\" opacity=\".7\"/></svg>"
    },
    {
      "number": "VIII",
      "key": "croak",
      "name": "THE CROAK",
      "meaning": "say the thing",
      "reading": "The swamp is listening. The frog who calls finds the frog who answers. Silence finds only silence.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#52ffe0\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"38\" cy=\"62\" rx=\"20\" ry=\"16\" fill=\"#1f5238\"/><circle cx=\"32\" cy=\"52\" r=\"5\" fill=\"#b6ff5b\"/><circle cx=\"32\" cy=\"52\" r=\"1.8\" fill=\"#081310\"/><path d=\"M28 66 Q40 72 50 64\"/><path d=\"M60 50 Q72 40 78 30\" stroke-dasharray=\"2 3\"/><path d=\"M58 42 Q66 30 70 22\" stroke-dasharray=\"2 3\" opacity=\".7\"/><text x=\"76\" y=\"22\" fill=\"#52ffe0\" stroke=\"none\" font-family=\"Bungee, sans-serif\" font-size=\"9\">!</text></svg>"
    },
    {
      "number": "IX",
      "key": "tide",
      "name": "THE TIDE",
      "meaning": "the next you is on the way",
      "reading": "Something is coming. Do not name it yet. Open the door wider — that is your only job.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#52ffe0\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 46 Q22 36 36 46 Q50 36 64 46 Q78 36 92 46\"/><path d=\"M8 60 Q22 50 36 60 Q50 50 64 60 Q78 50 92 60\" opacity=\".7\"/><path d=\"M8 74 Q22 64 36 74 Q50 64 64 74 Q78 64 92 74\" opacity=\".4\"/><circle cx=\"50\" cy=\"22\" r=\"8\" fill=\"#ffd23f\" opacity=\".8\" stroke=\"#ffd23f\"/></svg>"
    },
    {
      "number": "X",
      "key": "moss",
      "name": "THE MOSS",
      "meaning": "slow growth is growth",
      "reading": "One millimeter a year is a kingdom by the time anyone notices. Keep going.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#b6ff5b\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 80 Q22 60 30 56 Q24 50 28 38 Q34 42 36 32 Q42 38 46 30 Q50 38 56 32 Q60 42 66 32 Q70 38 74 38 Q80 50 74 56 Q82 60 80 80 Z\" fill=\"#1f5238\"/><circle cx=\"32\" cy=\"60\" r=\"2\" fill=\"#ffd23f\"/><circle cx=\"48\" cy=\"52\" r=\"2\" fill=\"#ffd23f\"/><circle cx=\"62\" cy=\"58\" r=\"2\" fill=\"#ffd23f\"/><circle cx=\"72\" cy=\"64\" r=\"2\" fill=\"#ffd23f\"/></svg>"
    },
    {
      "number": "XI",
      "key": "reed",
      "name": "THE REED",
      "meaning": "bend, hollow, sing",
      "reading": "What broke you is what makes you sound. Stop refusing the wind; start being the flute.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ffd23f\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M30 88 Q26 60 32 28\"/><ellipse cx=\"32\" cy=\"22\" rx=\"3\" ry=\"8\" fill=\"#ff8a3d\" stroke=\"#ff8a3d\"/><path d=\"M50 88 Q46 56 52 18\"/><ellipse cx=\"52\" cy=\"14\" rx=\"3\" ry=\"8\" fill=\"#ff8a3d\" stroke=\"#ff8a3d\"/><path d=\"M70 88 Q66 62 72 32\"/><ellipse cx=\"72\" cy=\"26\" rx=\"3\" ry=\"8\" fill=\"#ff8a3d\" stroke=\"#ff8a3d\"/><path d=\"M20 88 Q50 86 80 88\" stroke=\"#52ffe0\" opacity=\".5\"/></svg>"
    },
    {
      "number": "XII",
      "key": "snake",
      "name": "THE SNAKE",
      "meaning": "cunning is not cruelty",
      "reading": "Take the long way. The shortcut bites. You are allowed to be patient and clever at once.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ff4d8d\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16 80 Q30 70 26 56 Q22 42 38 38 Q56 36 56 50 Q56 64 70 62 Q86 60 82 44\"/><ellipse cx=\"82\" cy=\"42\" rx=\"5\" ry=\"4\" fill=\"#ff4d8d\"/><circle cx=\"80\" cy=\"40\" r=\"1.2\" fill=\"#ffd23f\"/><path d=\"M85 40 L92 38\" stroke=\"#ffd23f\"/></svg>"
    },
    {
      "number": "XIII",
      "key": "lantern",
      "name": "THE LANTERN",
      "meaning": "a small light, repeated",
      "reading": "Be the firefly. One blink will not light the swamp. A hundred thousand of them do.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ffd23f\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"50\" cy=\"52\" r=\"22\" fill=\"#ffd23f\" opacity=\".15\"/><circle cx=\"50\" cy=\"52\" r=\"12\" fill=\"#ffd23f\" opacity=\".5\"/><circle cx=\"50\" cy=\"52\" r=\"5\" fill=\"#ffd23f\"/><circle cx=\"22\" cy=\"28\" r=\"3\" fill=\"#ffd23f\" opacity=\".7\"/><circle cx=\"78\" cy=\"34\" r=\"3\" fill=\"#ffd23f\" opacity=\".7\"/><circle cx=\"78\" cy=\"74\" r=\"3\" fill=\"#ffd23f\" opacity=\".7\"/><circle cx=\"22\" cy=\"78\" r=\"3\" fill=\"#ffd23f\" opacity=\".7\"/></svg>"
    },
    {
      "number": "XIV",
      "key": "dragonfly",
      "name": "THE DRAGONFLY",
      "meaning": "transformation",
      "reading": "The version of you that flies is not the version that crawled. Stop apologizing for the molt.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#52ffe0\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"50\" cy=\"55\" rx=\"3\" ry=\"22\" fill=\"#52ffe0\"/><ellipse cx=\"32\" cy=\"44\" rx=\"14\" ry=\"6\" fill=\"#52ffe0\" opacity=\".35\" transform=\"rotate(-20 32 44)\"/><ellipse cx=\"68\" cy=\"44\" rx=\"14\" ry=\"6\" fill=\"#ff4d8d\" opacity=\".35\" transform=\"rotate(20 68 44)\"/><ellipse cx=\"34\" cy=\"60\" rx=\"12\" ry=\"5\" fill=\"#52ffe0\" opacity=\".35\" transform=\"rotate(20 34 60)\"/><ellipse cx=\"66\" cy=\"60\" rx=\"12\" ry=\"5\" fill=\"#ff4d8d\" opacity=\".35\" transform=\"rotate(-20 66 60)\"/><circle cx=\"50\" cy=\"32\" r=\"4\" fill=\"#ffd23f\"/><circle cx=\"48\" cy=\"30\" r=\"1\" fill=\"#081310\"/><circle cx=\"52\" cy=\"30\" r=\"1\" fill=\"#081310\"/></svg>"
    },
    {
      "number": "XV",
      "key": "stump",
      "name": "THE STUMP",
      "meaning": "what was felled became home",
      "reading": "The thing you mourn is now a habitat. Loss did not end the story; it changed the renters.",
      "svg": "<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#ff8a3d\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 80 L26 50 Q26 42 50 42 Q74 42 74 50 L78 80 Z\" fill=\"#3d2818\"/><ellipse cx=\"50\" cy=\"42\" rx=\"24\" ry=\"6\" fill=\"#5a3a22\"/><ellipse cx=\"50\" cy=\"42\" rx=\"16\" ry=\"4\" fill=\"none\"/><ellipse cx=\"50\" cy=\"42\" rx=\"8\" ry=\"2\" fill=\"none\"/><path d=\"M36 50 Q34 56 36 60\" opacity=\".5\"/><path d=\"M62 52 Q66 58 64 62\" opacity=\".5\"/><circle cx=\"40\" cy=\"36\" r=\"2\" fill=\"#b6ff5b\"/><circle cx=\"58\" cy=\"38\" r=\"2\" fill=\"#b6ff5b\"/></svg>"
    }
  ]
}
