Speak in runes, not static. — Volmarr, "Runes Over Prompt-Magic"
A runic cipher, divination, and visualization engine for the Elder Futhark.
Rúnavél is a Python command-line tool that bridges the ancient runic tradition with modern cryptography and divination practice. It treats the 24 runes of the Elder Futhark not as a toy substitution table, but as a living system of forces — each with its own phonetic value, metaphysical meaning, elemental affiliation, galdr chant, and wyrd-numerological weight.
pip install -e .For PNG export support:
pip install -e ".[png]"pytest159 tests covering runes dataset, cipher encode/decode, divination engine, SVG/PNG rendering, terminal rendering, and CLI commands.
# Encode text to runes (substitution mode)
runavel encode "Hello world"
# → ᚺᛖᛚᛚᛟ ᚹᛟᚱᛚᛞ
# Decode runes to text
runavel decode "ᚹᛟᛚᛗᚨᚱᚱ"
# → wolmarr
# Caesar-shift cipher (default key: 3, Þurs-shift)
runavel shift "Secret" 7
runavel unshift "ᛚᛟᛁᚾᛟᛜ" 7
# Wyrd numerological encoding (lossy, associative)
runavel wyrd "Runa"# Draw a single rune
runavel draw
runavel draw -q "Should I take this path?"
# Three-rune spread (Past/Present/Future)
runavel spread "What guides my path?"
# Ætt-spread (one rune from each ætt)
runavel spread "What feeds the creative fire?" --aett# Full futhark reference table
runavel futhark
# Detailed information about a specific rune
runavel info Fehu
runavel info ᚦ
# Display the banner
runavel bannerRúnavél can render runes and spreads as beautiful SVG or PNG images, with customizable styles:
# Render a single rune as SVG
runavel render-rune Fehu -o fehu.svg
# Render with custom style
runavel render-rune Algiz --stroke-color "#FF0000" --background "#000000" -o algiz.svg
# Render as PNG (requires cairosvg: pip install -e ".[png]")
runavel render-rune Fehu -o fehu.png
# Render a bindrune (composed overlay of multiple runes)
runavel render-bindrune Algiz Sowilo --name "Victory Shield" -o victory.svg
# Render a divination spread
runavel render-spread "What guides my path?" -o reading.svg
runavel render-spread "What guides my path?" --aett --seed 42 -o aett_reading.svg
# Render the futhark circle
runavel render-circle --title "Norns' Wheel" -o circle.svg
runavel render-circle --highlight Fehu Uruz Thurisaz --title "ᚠᚢᚦ Guardian Force" -o highlighted.svg
# Render the full futhark table
runavel render-futhark -o futhark.svgAll render commands support style customization:
| Option | Description | Default |
|---|---|---|
--stroke-color |
Rune stroke color | #D4A017 (runic gold) |
--background |
Background color | #1A1A2E (deep night) |
--text-color |
Text color | #E8D5B7 (parchment cream) |
--accent-color |
Border/accent color | #D4A017 (gold accent) |
--width |
Image width in pixels | Varies by command |
--height |
Image height in pixels | Varies by command |
--no-metadata |
Hide rune metadata (rune cards only) | off |
--no-border |
Hide border (rune cards only) | off |
The simplest mode. Each phoneme maps directly to its corresponding rune. "F" → Fehu, "Th" → Thurisaz, etc. Fully reversible.
A key number shifts positions along the 24-rune futhark. Similar to a Caesar cipher but applied to the futhark ring. Requires the same key to decode. Default key is 3 (Þurs-shift, after the 3rd rune Thurisaz).
The most mystical and least reversible mode. Characters are mapped to runes through numerological associations using the sacred numbers 7 and 3. Multiple Latin characters may collapse to the same rune — this is intentional. The Norns do not reverse their weaving.
The 24 runes of the Elder Futhark are organized in three families:
| Ætt | Runes | Domain |
|---|---|---|
| Freyja's Ætt | ᚠᚢᚦᚨᚱᚲᚷᚹ | Vitality, abundance, earthly forces |
| Heimdall's Ætt | ᚺᚾᛁᛃᛇᛈᛉᛊ | Resistance, transformation, testing |
| Týr's Ætt | ᛏᛒᛖᛗᛚᛜᛞᛟ | Destiny, community, cosmic order |
The divination engine offers three spread types:
- Single Draw: One rune for quick guidance
- Three-Rune Spread: Past / Present / Future
- Ætt-Spread: One rune from each ætt, reading vitality → resistance → destiny
Reversible runes have a 25% chance of appearing inverted (merkstave), reflecting traditional practice.
Each spread provides:
- Rune card with ASCII stave art
- Ætt and elemental affiliations
- Keywords and galdr chants
- Inversion warnings where applicable
- Synthesis section with elemental dominance, ætt balance, and wyrd sum
- Wyrd Rune: The hidden thread — the reduced numerological sum reveals a rune that binds the spread together
runavel/
├── runes.py # Complete Elder Futhark dataset (24 Rune dataclasses)
├── cipher.py # Three cipher modes: Substitution, Shift, Wyrd
├── divination.py # Spread drawing, inversion, interpretation
├── renderer.py # Terminal art: staves, cards, banners, tables
├── svg_renderer.py # SVG/PNG generation: cards, bindrunes, circles, spreads
├── cli.py # argparse CLI interface
├── __init__.py # Package metadata & public API
└── __main__.py # Entry point
The runes are not merely letters. They are forces — living currents in the wyrd-web, older than language, older than the gods who named them.
Rúnavél does not treat the futhark as a codebook. Each rune is a frozen dataclass carrying its full metaphysical weight: meaning, element, galdr, reversibility, wyrd value, and description. The cipher modes reflect different relationships with the runes — from the clean trade route of direct substitution to the seidhr-craft of wyrd numerology.
Forged by Runa Gridweaver Freyjasdottir in May 2026.
Built on the Elder Futhark tradition and the grimoire work of Yrsa Freydisdottir (as preserved in the Norse Saga Engine).
Runic divination is not fortune-telling. It is the art of reading the currents of wyrd — the great web of cause and consequence that the Norns weave at the well of Urdhr. The Norns do not determine your fate. They reveal its shape.
MIT — see LICENSE.
ᚠ ᚢ ᚦ ᚨ ᚱ ᚲ ᚷ ᚹ · ᚺ ᚾ ᛁ ᛃ ᛇ ᛈ ᛉ ᛊ · ᛏ ᛒ ᛖ ᛗ ᛚ ᛜ ᛞ ᛟ