Comparison with Wally

Overview

Jelly builds on top of the Wally ecosystem while providing significant improvements in developer experience, performance, and features. Both tools use the same package registry and format, making migration seamless.

Feature Comparison Table

FeatureWallyJelly
Configuration Formatwally.tomljelly.json
Lockfile Supportwally-lock.tomljelly-lock.json
Version ResolutionBasic semverAdvanced with conflict detection
Package CleanupDownloads entire reposSmart cleanup, removes bloat
Package RegistryWally RegistriesWally Registries
Package FormatStandardSame
CLI InterfaceBasic commandsEnhanced with more options
Space EfficiencyDownloads everythingOptimizes packages
Dependency AnalysisNoBuilt-in conflict detection
Scripts SupportNonpm-style scripts

Detailed Comparisons

Configuration Files

Wally Configuration (wally.toml)

[package]
name = "my-game"
version = "1.0.0"
registry = "https://github.com/UpliftGames/wally-index"
realm = "shared"

[dependencies]
Roact = "roblox/roact@^1.4.0"
Rodux = "roblox/rodux@^3.0.0"

[dev-dependencies]
TestEZ = "roblox/testez@^0.4.0"

Jelly Configuration (jelly.json)

{
  "name": "my-game",
  "version": "1.0.0",
  "description": "My awesome Roblox game",
  "dependencies": {
    "roblox/roact": "^1.4.0",
    "roblox/rodux": "^3.0.0"
  },
  "devDependencies": {
    "roblox/testez": "^0.4.0"
  },
  "scripts": {
    "build": "rojo build",
    "serve": "rojo serve",
    "test": "rojo test"
  },
  "jelly": {
    "cleanup": true,
    "optimize": true,
    "packagesPath": "Packages"
  }
}

Advantages of JSON:

  • More familiar to web developers
  • Better IDE support and validation
  • Easier programmatic manipulation
  • Support for complex data structures

Package Management

Wally Approach

# Basic Wally commands
wally install
wally add roblox/roact
wally remove roblox/roact
wally list
wally login
wally publish

Jelly Approach

# Enhanced Jelly commands
jelly install
jelly add roblox/roact
jelly remove roblox/roact
jelly list
jelly search roact --limit 20
jelly info roblox/roact
jelly update
jelly outdated
jelly clean
jelly run build

Version Resolution

Wally Version Resolution

Basic semver resolution with limited conflict handling:

# Wally might silently pick incompatible versions
wally install

Jelly Version Resolution

Advanced resolution with clear conflict reporting:

jelly install
# or analyze first
jelly analyze

Output Example:

⚠️  Version conflicts detected:
  roblox/roact:
    package-a requires ^1.4.0
    package-b requires ^1.3.0
    → Resolved to 1.4.2

✅ All conflicts resolved successfully!

CLI Experience

Command Comparison

OperationWallyJelly
Initializewally initjelly init
Installwally installjelly install
Add packagewally add roblox/roactjelly add roblox/roact
Searchwally search roblox/roactjelly search roact --limit 10
Package infoNo built-in infojelly info roblox/roact
List packageswally listjelly list
Update packagesManual editingjelly update
Check outdatedNo commandjelly outdated
Run scriptsNo supportjelly run build
Clean packagesNo commandjelly clean

Jelly Search Features:

# Configurable result limits
jelly search ui --limit 20

# Detailed package information
jelly info roblox/roact

# Short aliases
jelly s roact -l 5

Migration Guide

From Wally to Jelly

1. Install Jelly

# Add to aftman.toml
aftman add OMouta/Jelly
aftman install

2. Convert Configuration

Transform wally.toml:

[package]
name = "my-game"
version = "1.0.0"

[dependencies]
Roact = "roblox/roact@^1.4.0"

To jelly.json:

{
  "name": "my-game",
  "version": "1.0.0",
  "dependencies": {
    "roblox/roact": "^1.4.0"
  }
}

3. Clean and Reinstall

# Remove Wally packages
rm -rf Packages
rm wally.toml wally-lock.toml

# Install with Jelly
jelly install

4. Update Scripts

Replace Wally commands in your scripts:

Before:

wally install
wally list

After:

jelly install
jelly list

Dual Usage

You can use both tools in the same project during transition:

project/
├── wally.toml          # Keep for team members using Wally
├── jelly.json          # Add for Jelly users
├── Packages/           # Shared by both tools
└── default.project.json

Keep dependencies synchronized between both files until full migration.