DEV Community

Cover image for LUMOS vs Codama: Understanding Solana's Schema Generation Tools
RECTOR SOL for LUMOS

Posted on Originally published at docs.lumos-lang.org

LUMOS vs Codama: Understanding Solana's Schema Generation Tools

Building on Solana? You've probably wondered: "Should I use LUMOS or Codama?"

The answer: Both. They're complementary, not competing.

Let me explain why.

TL;DR

  • LUMOS = Define data schemas → Generate Rust + TypeScript code (pre-deployment)
  • Codama = Parse existing programs → Generate client SDKs (post-deployment)

They work at different layers and can be used together.


Where Each Tool Fits

┌─────────────────────────────────────────────────────────────┐
│                   YOUR SOLANA PROGRAM                       │
│  ┌────────────────────────────────────────────────────────┐ │
│  │                                                        │ │
│  │   ┌──────────────────┐                                 │ │
│  │   │  Account Data    │ ◄── LUMOS generates this        │ │
│  │   │  (structs/enums) │     (data structure code)       │ │
│  │   └──────────────────┘                                 │ │
│  │                                                        │ │
│  │   ┌──────────────────┐                                 │ │
│  │   │  Instructions    │     (you write this manually    │ │
│  │   │  (program logic) │      or with Anchor)            │ │
│  │   └──────────────────┘                                 │ │
│  │                                                        │ │
│  └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
                              ▲
                              │ Codama parses program
                              │ and generates...
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                        CLIENTS                              │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐         │
│  │   JS    │  │  Rust   │  │ Python  │  │  Dart   │         │
│  │ Client  │  │ Client  │  │ Client  │  │ Client  │         │
│  └─────────┘  └─────────┘  └─────────┘  └─────────┘         │
│                                                             │
│  ◄── Codama generates these (SDK code to interact)          │
└─────────────────────────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

Key insight: LUMOS generates code that goes inside your program. Codama generates code that interacts with your program from outside.


What is Codama?

Codama is a code generation framework that creates standardized descriptions of Solana programs. It works around a central concept called the Codama IDL.

Core workflow:

Existing Program → Parse → Codama IDL → Generate Clients
     or
Anchor IDL → Convert → Codama IDL → Generate Clients
Enter fullscreen mode Exit fullscreen mode

What Codama does:

  • Parses existing Solana programs or Anchor IDL files
  • Creates a unified IDL representation with 60+ node types
  • Generates client SDKs in multiple languages (JS, Rust, Python, Dart)
  • Produces documentation and tooling for program interfaces

Primary use case: "I have a deployed Solana program, now I need to generate client libraries."


What is LUMOS?

LUMOS is a schema-first DSL for defining data structures with guaranteed type safety across Rust and TypeScript.

Core workflow:

.lumos Schema → Parse → IR → Generate Rust + TypeScript
Enter fullscreen mode Exit fullscreen mode

What LUMOS does:

  • Defines data structures in a clean, Rust-like syntax
  • Generates Rust structs with proper Borsh serialization
  • Generates TypeScript interfaces with matching Borsh schemas
  • Ensures type safety between on-chain and off-chain code
  • Supports Anchor framework integration via #[account] attribute

Primary use case: "I want a single source of truth for my data types."


Key Differences

1. Workflow Direction

Aspect LUMOS Codama
Direction Forward (schema → code) Reverse (program → clients)
Input .lumos schema files Existing programs or Anchor IDL
Stage Pre-deployment Post-deployment

2. What They Generate

LUMOS generates data structure code:

// Input: schema.lumos
#[solana]
#[account]
struct PlayerAccount {
    wallet: PublicKey,
    level: u16,
    experience: u64,
}
Enter fullscreen mode Exit fullscreen mode
// Output: generated.rs (goes INTO your program)
use anchor_lang::prelude::*;

#[account]
pub struct PlayerAccount {
    pub wallet: Pubkey,
    pub level: u16,
    pub experience: u64,
}
Enter fullscreen mode Exit fullscreen mode

Codama generates client SDK code:

// Output: client SDK (CALLS your program from outside)
await program.methods
  .createPlayer()
  .accounts({
    player: playerPda,
    authority: wallet.publicKey,
  })
  .rpc();
Enter fullscreen mode Exit fullscreen mode

3. Feature Comparison

Feature LUMOS Codama
Struct definitions ✅ ✅
Enum definitions ✅ ✅
Borsh serialization ✅ ✅
Instruction builders ❌ ✅
Error types ❌ ✅
CLI generation ❌ ✅
Go support ✅ ❌
Ruby support ✅ ❌
Dart support ❌ ✅

When to Use Each

Use LUMOS When:

✅ Defining new data structures for a Solana program
✅ Need Rust + TypeScript type synchronization with Borsh
✅ Building new programs and want a single source of truth
✅ Want compile-time guarantees that types match
✅ Need Go or Ruby code generation

Use Codama When:

✅ Building clients for existing/deployed programs
✅ Need full SDK generation with instruction builders
✅ Want Dart support or Umi framework integration
✅ Generating documentation for your program
✅ Need CLI tools for program interaction


Using Both Together

Here's how a complete workflow looks:

┌─────────────────────────────────────────────────────────────┐
│  PHASE 1: Define Data Structures (LUMOS)                    │
│                                                             │
│  schema.lumos → lumos generate → generated.rs + generated.ts│
└─────────────────────────────────────────────────────────────┘
                              ▼
┌─────────────────────────────────────────────────────────────┐
│  PHASE 2: Build Program (Anchor/Native)                     │
│                                                             │
│  Use generated.rs in your program + write instructions      │
└─────────────────────────────────────────────────────────────┘
                              ▼
┌─────────────────────────────────────────────────────────────┐
│  PHASE 3: Deploy & Generate Clients (Codama)                │
│                                                             │
│  Deploy program → Parse IDL → Generate full client SDKs     │
└─────────────────────────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

Summary

Aspect LUMOS Codama
Philosophy Schema-first IDL-centric
Direction Schema → Code Program → Clients
Stage Pre-deployment Post-deployment
Focus Data structures Full program interface

They're complementary tools:

  • Use LUMOS when defining your data schemas during development
  • Use Codama when generating client libraries for distribution

Get Started

# Install LUMOS CLI
cargo install lumos-cli

# Generate from schema
lumos generate schema.lumos
Enter fullscreen mode Exit fullscreen mode

Have questions? Drop them in the comments below!

Top comments (0)