Hex.pm Documentation License: MIT

High-performance TOON (Token-Oriented Object Notation) encoder/decoder for Elixir with Phoenix Channels support.

TOON is a compact, human-readable data format optimized for LLM token efficiency.

Features

  • 🎯 Token Efficient: 30-60% fewer tokens for LLMs than JSON
  • 📖 Human Readable: Indentation-based structure like YAML
  • Spec Compliant: Tested against official TOON v3.0 specification
  • 🔌 Phoenix Channels: Built-in serializer support
  • 🛠️ JSON Converter: Bidirectional JSON ↔ TOON conversion
  • 🔧 Extensible: Custom encoding via ToonEx.Encoder protocol

Installation

Add toon_ex to your dependencies in mix.exs:

def deps do
  [
    {:toon_ex, "~> 0.8"}
  ]
end

Quick Start

Encoding

# Nested object
ToonEx.encode!(%{"user" => %{"name" => "Bob"}})
# => "user:\n  name: Bob"

# Arrays
ToonEx.encode!(["elixir", "toon"])
# => "[2]: elixir,toon"

Decoding

ToonEx.decode!("name: Alice\nage: 30")
# => %{"name" => "Alice", "age" => 30}

ToonEx.decode!("tags[2]: a,b")
# => %{"tags" => ["a", "b"]}

Phoenix Channels

# In your endpoint configuration
config :my_app, MyApp.Endpoint,
  websocket: [
    serializer: [{ToonEx.Phoenix.Serializer, "~> 2.0.0"}]
  ]

Or (if not using Phoenix for LiveView/Restful Apis)

config :phoenix, :json_library, ToonEx

See ToonEx.Phoenix.Serializer for details.

API Reference

Core Functions

Modules

  • ToonEx - Main API
  • ToonEx.Encode - Encoder implementation
  • ToonEx.Decode - Decoder implementation
  • ToonEx.JSON - JSON ↔ TOON converter
  • ToonEx.Encoder - Protocol for custom struct encoding
  • ToonEx.Phoenix.Serializer - Phoenix Channels serializer

Specification

This implementation follows TOON Specification v3.0 and is tested against official fixtures.

Testing

# Run all tests
mix test

# Run with coverage
mix coveralls

# Code quality checks
mix quality

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

License

MIT License - see LICENSE.