fory

0.16.0

A blazingly fast multi-language serialization framework powered by JIT and zero-copy.
apache/fory

What's New

v0.16.0

2026-03-17T04:14:34Z

The Apache Fory team is pleased to announce the 0.16.0 release. This is a major release that includes 91 PR from 17 distinct contributors. See the Install Page to learn how to get the libraries for your platform.

Highlights

C# Serialization: First Release

Apache Fory 0.16.0 is the first release with official C# serialization support.
The C# runtime targets modern .NET workloads and brings the same object graph,
cross-language, and schema-evolution model available in other Fory runtimes.

Key capabilities:

  • High-performance binary serialization for .NET 8+ with source-generator-based serializers for [ForyObject] types
  • Cross-language mode with Java, Python, C++, Go, Rust, and JavaScript
  • Optional reference tracking for shared and circular object graphs
  • Compatible mode for schema evolution
  • Dynamic object payloads, custom serializers, and namespace/name registration APIs
  • ThreadSafeFory wrapper for concurrent service workloads
  • C# target support in the Fory IDL/compiler workflow

Quick Start

using Apache.Fory;

[ForyObject]
public sealed class User
{
    public long Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public string? Email { get; set; }
}

Fory fory = Fory.Builder()
    .Xlang(true)
    .Compatible(true)
    .Build();
fory.Register<User>(1);

byte[] payload = fory.Serialize(new User
{
    Id = 1,
    Name = "Alice",
    Email = "alice@example.com",
});
User decoded = fory.Deserialize<User>(payload);

C# Benchmarks

Below are timing results (ns/op; lower is better) comparing Fory with Protobuf
and Msgpack across representative data structures.

Data Type Operation Fory Protobuf Msgpack
Struct Serialize 39.2 121.5 66.0
Struct Deserialize 58.3 180.1 102.6
Sample Serialize 269.2 562.6 339.6
Sample Deserialize 175.6 1084.9 531.8
MediaContent Serialize 306.3 434.7 351.5
MediaContent Deserialize 379.4 718.8 676.9
StructList Serialize 136.1 468.5 266.9
StructList Deserialize 221.1 687.0 488.5
SampleList Serialize 1198.9 2811.9 1635.7
SampleList Deserialize 791.5 5174.5 2629.2
MediaContentList Serialize 1393.9 2199.4 1710.9
MediaContentList Deserialize 1719.5 3373.1 3401.2

Serialized data sizes (bytes):

Data Type Fory Protobuf Msgpack
Struct 58 61 55
Sample 446 460 562
MediaContent 365 307 479
StructList 184 315 284
SampleList 1980 2315 2819
MediaContentList 1535 1550 2404

Benchmark details: https://fory.apache.org/docs/benchmarks/csharp/

Swift Serialization: First Release

Apache Fory 0.16.0 is also the first release with official Swift serialization
support. The Swift implementation focuses on idiomatic API design, macro-based
model serialization, cross-language compatibility, and strong support for object
graph workloads.

Key capabilities:

  • High-performance serialization for Swift value and reference types
  • @ForyObject macro for zero-boilerplate model serialization
  • Cross-language protocol compatibility with Java, Python, C++, Go, Rust, and JavaScript
  • Compatible mode for schema evolution across versions
  • Dynamic value support for Any, AnyObject, any Serializer, and AnyHashable
  • Reference tracking for shared/circular graphs, including weak references on classes
  • Swift target support in the Fory IDL/compiler workflow

Quick Start

import Fory

@ForyObject
struct User: Equatable {
    var name: String = ""
    var age: Int32 = 0
}

let fory = Fory(xlang: true, trackRef: false, compatible: true)
fory.register(User.self, id: 1)

let input = User(name: "Alice", age: 30)
let data = try fory.serialize(input)
let output: User = try fory.deserialize(data)

Swift Benchmarks

Below are throughput results (ops/sec; higher is better) comparing Fory with
Protobuf and Msgpack across representative data structures.

Data Type Operation Fory Protobuf Msgpack Fastest
Struct Serialize 9,727,950 6,572,406 141,248 fory (1.48x)
Struct Deserialize 11,889,570 8,584,510 99,792 fory (1.39x)
Sample Serialize 3,496,305 1,281,983 17,188 fory (2.73x)
Sample Deserialize 1,045,018 765,706 12,767 fory (1.36x)
MediaContent Serialize 1,425,354 678,542 29,048 fory (2.10x)
MediaContent Deserialize 614,447 478,298 12,711 fory (1.28x)
StructList Serialize 3,307,962 1,028,210 24,781 fory (3.22x)
StructList Deserialize 2,788,200 708,596 8,160 fory (3.93x)
SampleList Serialize 715,734 205,380 3,361 fory (3.48x)
SampleList Deserialize 199,317 133,425 1,498 fory (1.49x)
MediaContentList Serialize 364,097 103,721 5,538 fory (3.51x)
MediaContentList Deserialize 103,421 86,331 1,529 fory (1.20x)

Serialized data sizes (bytes):

Data Type Fory Protobuf Msgpack
MediaContent 365 301 524
MediaContentList 1535 1520 2639
Sample 446 375 737
SampleList 1980 1890 3698
Struct 58 61 65
StructList 184 315 338

Benchmark details: https://fory.apache.org/docs/benchmarks/swift/

Features

Bug Fix

  • fix(java): Fix EnumSetSerializer for enums with overriding methods by @NotLebedev in #3315
  • fix(java): Deserialize nested HashMap subclasses by @mandrean in #3342
  • fix(java): support TreeSet/TreeMap subclasses without Comparator constructor in SortedSet/SortedMapSerializer by @mandrean in #3344
  • fix(c++): fix buffer read/write bound check by @chaokunyang in #3418
  • fix: avoid NoClassDefFoundError in supportCodegenForJavaSerialization by @siy in #3424
  • fix(docs): updated the compiler guide by @ayush00git in #3420
  • fix(python): return UTC-aware datetime instead of naive datetime by @yuta4895 in #3439
  • fix(docs): adjusted sidebar position and fixed typos by @ayush00git in #3450
  • fix(python): support tuple dataclass fields and object instances by @chaokunyang in #3468
  • fix(python): fix python wheel build by @chaokunyang in #3469
  • fix(java): avoid deflater meta decompression hang on invalid input by @chaokunyang in #3472

Other Improvements

New Contributors

Apache Fory logo

Build Status Slack Channel X Maven Version Crates.io PyPI

Apache Foryβ„’ is a blazingly-fast multi-language serialization framework powered by JIT compilation, zero-copy techniques, and advanced code generation, achieving up to 170x performance improvement while maintaining simplicity and ease of use.

https://fory.apache.org

Important

Apache Foryβ„’ was previously named as Apache Fury. For versions before 0.11, please use "fury" instead of "fory" in package names, imports, and dependencies, see Fury Docs for how to use Fury in older versions.

Key Features

High-Performance Serialization

Apache Foryβ„’ delivers excellent performance through advanced optimization techniques:

  • JIT Compilation: Runtime code generation for Java eliminates virtual method calls and inlines hot paths
  • Static Code Generation: Compile-time code generation for Rust, C++, and Go delivers peak performance without runtime overhead
  • Meta Packing & Sharing: Class metadata packing and sharing reduces redundant type information across objects on one stream

Cross-Language Serialization

The xlang serialization format enables seamless data exchange across programming languages:

  • Reference Preservation: Shared and circular references work correctly across languages
  • Polymorphism: Objects serialize/deserialize with their actual runtime types
  • Schema Evolution: Optional forward/backward compatibility for evolving schemas
  • Automatic Serialization: Serialize domain objects automatically, no IDL or schema definitions required

Row Format

A cache-friendly row format optimized for analytics workloads:

  • Zero-Copy Random Access: Read individual fields without deserializing entire objects
  • Partial Operations: Selective field serialization and deserialization for efficiency
  • Apache Arrow Integration: Seamless conversion to columnar format for analytics pipelines
  • Multi-Language: Available in Java, Python, Rust and C++

Security & Production-Readiness

Built for production environments with secure defaults and explicit control:

  • Class Registration: Whitelist-based deserialization control is enabled by default to block untrusted classes.
  • Depth Limiting: Configurable object graph depth limits mitigate recursive and stack exhaustion attacks.
  • Configurable Policies: Custom class checkers and deserialization policies let teams enforce internal security rules.
  • Platform Support: Runs on Java 8 through 25, supports GraalVM native image, and works across major operating systems.

Protocols

Apache Foryβ„’ provides three protocol families optimized for different scenarios:

Protocol Family Use Case Key Features
Xlang Serialization Cross-language object exchange Automatic serialization, reference preservation, polymorphism
Row Format Analytics and data processing Zero-copy random access, partial operations, Apache Arrow compatibility
Native Serialization Language-specific optimization Native protocol implementations per language, including Java Serialization and Python Native. Python Native extends Xlang with more type support and better performance.

All protocol families share the same optimized codebase, allowing improvements in one family to benefit others.

Benchmarks

Java Serialization Performance

Charts labeled "compatible" show schema evolution mode with forward/backward compatibility enabled, while others show schema consistent mode where class schemas must match.

Serialization Throughput:

Java Serialization Throughput

Deserialization Throughput:

Java Deserialization Throughput

See Java Benchmarks for more details.

Rust Serialization Performance

Fory Rust demonstrates competitive performance compared to other Rust serialization frameworks.

For more detailed benchmarks and methodology, see Rust Benchmarks.

C++ Serialization Performance

Fory C++ demonstrates competitive performance compared to protobuf c++ serialization framework.

For more detailed benchmarks and methodology, see C++ Benchmarks.

Go Serialization Performance

Fory Go demonstrates excellent performance compared to other go serialization frameworks:

For more detailed benchmarks and methodology, see Go Benchmark.

C# Serialization Performance

Fory C# demonstrates excellent performance compared to protobuf-net and MessagePack-CSharp:

For more detailed benchmarks and methodology, see C# Benchmarks.

Swift Serialization Performance

For more detailed benchmarks and methodology, see SwiftBenchmarks.

Installation

Java:

<dependency>
  <groupId>org.apache.fory</groupId>
  <artifactId>fory-core</artifactId>
  <version>0.15.0</version>
</dependency>

Snapshots are available from https://repository.apache.org/snapshots/ (version 0.15.0-SNAPSHOT).

Scala:

// Scala 2.13
libraryDependencies += "org.apache.fory" % "fory-scala_2.13" % "0.15.0"

// Scala 3
libraryDependencies += "org.apache.fory" % "fory-scala_3" % "0.15.0"

Kotlin:

<dependency>
  <groupId>org.apache.fory</groupId>
  <artifactId>fory-kotlin</artifactId>
  <version>0.15.0</version>
</dependency>

Python:

pip install pyfory

# With row format support
pip install pyfory[format]

Rust:

[dependencies]
fory = "0.14"

C++:

Fory C++ supports both CMake and Bazel build systems. See C++ Installation Guide for detailed instructions.

Golang:

go get github.com/apache/fory/go/fory

Quick Start

This section provides quick examples for getting started with Apache Foryβ„’. For comprehensive guides, see the Documentation.

Native Serialization

Always use native mode when working with a single language. Native mode delivers optimal performance by avoiding the type metadata overhead required for cross-language compatibility. Xlang mode introduces additional metadata encoding costs and restricts serialization to types that are common across all supported languages. Language-specific types will be rejected during serialization in xlang-mode.

Java Serialization

When you don't need cross-language support, use Java mode for optimal performance.

import org.apache.fory.*;
import org.apache.fory.config.*;

public class Example {
  public static class Person {
    String name;
    int age;
  }

  public static void main(String[] args) {
    // Create Fory instance - should be reused across serializations
    BaseFory fory = Fory.builder()
      .withLanguage(Language.JAVA)
      .requireClassRegistration(true)
      // replace `build` with `buildThreadSafeFory` for Thread-Safe Usage
      .build();
    // Register your classes (required when class registration is enabled)
    // Registration order must be consistent if id is not specified
    fory.register(Person.class);
    // Serialize
    Person person = new Person();
    person.name = "chaokunyang";
    person.age = 28;
    byte[] bytes = fory.serialize(person);
    Person result = (Person) fory.deserialize(bytes);
    System.out.println(result.name + " " + result.age);  // Output: chaokunyang 28
  }
}

For detailed Java usage including compatibility modes, compression, and advanced features, see Java Serialization Guide and java/README.md.

Python Serialization

Python native mode provides a high-performance drop-in replacement for pickle/cloudpickle with better speed and compatibility.

from dataclasses import dataclass
import pyfory

@dataclass
class Person:
    name: str
    age: pyfory.int32

# Create Fory instance - should be reused across serializations
fory = pyfory.Fory()
# Register your classes (required when class registration is enabled)
fory.register_type(Person)
person = Person(name="chaokunyang", age=28)
data = fory.serialize(person)
result = fory.deserialize(data)
print(result.name, result.age)  # Output: chaokunyang 28

For detailed Python usage including type hints, compatibility modes, and advanced features, see Python Guide.

Rust Serialization

Rust native mode provides compile-time code generation via derive macros for high-performance serialization without runtime overhead.

use fory::{Fory, ForyObject};

#[derive(ForyObject, Debug, PartialEq)]
struct Person {
    name: String,
    age: i32,
}

fn main() -> Result<(), fory::Error> {
    // Create Fory instance - should be reused across serializations
    let mut fory = Fory::default();
    // Register your structs (required when class registration is enabled)
    fory.register::<Person>(1);
    let person = Person {
        name: "chaokunyang".to_string(),
        age: 28,
    };
    let bytes = fory.serialize(&person);
    let result: Person = fory.deserialize(&bytes)?;
    println!("{} {}", result.name, result.age); // Output: chaokunyang 28
    Ok(())
}

For detailed Rust usage including collections, references, and custom serializers, see Rust Guide.

C++ Serialization

C++ native mode provides compile-time reflection via the FORY_STRUCT macro for efficient serialization with zero runtime overhead.

#include "fory/serialization/fory.h"

using namespace fory::serialization;

struct Person {
    std::string name;
    int32_t age;
};
FORY_STRUCT(Person, name, age);

int main() {
    // Create Fory instance - should be reused across serializations
    auto fory = Fory::builder().build();
    // Register your structs (required when class registration is enabled)
    fory.register_struct<Person>(1);
    Person person{"chaokunyang", 28};
    auto bytes = fory.serialize(person).value();
    auto result = fory.deserialize<Person>(bytes).value();
    std::cout << result.name << " " << result.age << std::endl;  // Output: chaokunyang 28
}

For detailed C++ usage including collections, smart pointers, and error handling, see C++ Guide.

Scala Serialization

Scala native mode provides optimized serialization for Scala-specific types including case classes, collections, and Option types.

import org.apache.fory.Fory
import org.apache.fory.config.Language
import org.apache.fory.serializer.scala.ScalaSerializers

case class Person(name: String, age: Int)

object Example {
  def main(args: Array[String]): Unit = {
    // Create Fory instance - should be reused across serializations
    val fory = Fory.builder()
      .withLanguage(Language.JAVA)
      .requireClassRegistration(true)
      .build()
    // Register Scala serializers for Scala-specific types
    ScalaSerializers.registerSerializers(fory)
    // Register your case classes
    fory.register(classOf[Person])
    val bytes = fory.serialize(Person("chaokunyang", 28))
    val result = fory.deserialize(bytes).asInstanceOf[Person]
    println(s"${result.name} ${result.age}")  // Output: chaokunyang 28
  }
}

For detailed Scala usage including collection serialization and integration patterns, see Scala Guide.

Kotlin Serialization

Kotlin native mode provides optimized serialization for Kotlin-specific types including data classes, nullable types, and Kotlin collections.

import org.apache.fory.Fory
import org.apache.fory.config.Language
import org.apache.fory.serializer.kotlin.KotlinSerializers

data class Person(val name: String, val age: Int)

fun main() {
    // Create Fory instance - should be reused across serializations
    val fory = Fory.builder()
        .withLanguage(Language.JAVA)
        .requireClassRegistration(true)
        .build()
    // Register Kotlin serializers for Kotlin-specific types
    KotlinSerializers.registerSerializers(fory)
    // Register your data classes
    fory.register(Person::class.java)
    val bytes = fory.serialize(Person("chaokunyang", 28))
    val result = fory.deserialize(bytes) as Person
    println("${result.name} ${result.age}")  // Output: chaokunyang 28
}

For detailed Kotlin usage including null safety and default value support, see kotlin/README.md.

Cross-Language Serialization

Only use xlang mode when you need cross-language data exchange. Xlang mode adds type metadata overhead for cross-language compatibility and only supports types that can be mapped across all languages. For single-language use cases, always prefer native mode for better performance.

The following examples demonstrate serializing a Person object across Java and Rust. For other languages (Python, Go, JavaScript, etc.), simply set the language mode to XLANG and follow the same pattern.

Java

import org.apache.fory.*;
import org.apache.fory.config.*;

public class XlangExample {
  public record Person(String name, int age) {}

  public static void main(String[] args) {
    // Create Fory instance with XLANG mode
    Fory fory = Fory.builder()
      .withLanguage(Language.XLANG)
      .build();

    // Register with cross-language type id/name
    fory.register(Person.class, 1);
    // fory.register(Person.class, "example.Person");
    Person person = new Person("chaokunyang", 28);
    byte[] bytes = fory.serialize(person);
    // bytes can be deserialized by Rust, Python, Go, or other languages
    Person result = (Person) fory.deserialize(bytes);
    System.out.println(result.name + " " + result.age);  // Output: chaokunyang 28
  }
}

Rust

use fory::{Fory, ForyObject};

#[derive(ForyObject, Debug)]
struct Person {
    name: String,
    age: i32,
}

fn main() -> Result<(), Error> {
    let mut fory = Fory::default();
    fory.register::<Person>(1)?;
    // fory.register_by_name::<Person>("example.Person")?;
    let person = Person {
        name: "chaokunyang".to_string(),
        age: 28,
    };
    let bytes = fory.serialize(&person);
    // bytes can be deserialized by Java, Python, Go, or other languages
    let result: Person = fory.deserialize(&bytes)?;
    println!("{} {}", result.name, result.age);  // Output: chaokunyang 28
}

Key Points for Cross-Language Serialization:

  • Use Language.XLANG mode in all languages
  • Register types with consistent IDs or names across all languages:
    • By ID (fory.register(Person.class, 1)): Faster serialization, more compact encoding, but requires coordination to avoid ID conflicts
    • By name (fory.register(Person.class, "example.Person")): More flexible, less prone to conflicts, easier to manage across teams, but slightly larger encoding
  • Type IDs/names must match across all languages for successful deserialization
  • Only use types that have cross-language mappings (see Type Mapping)

For examples with circular references, shared references, and polymorphism across languages, see:

Row Format Encoding

Row format provides zero-copy random access to serialized data, making it ideal for analytics workloads and data processing pipelines.

Java

import org.apache.fory.format.*;
import java.util.*;
import java.util.stream.*;

public class Bar {
  String f1;
  List<Long> f2;
}

public class Foo {
  int f1;
  List<Integer> f2;
  Map<String, Integer> f3;
  List<Bar> f4;
}

RowEncoder<Foo> encoder = Encoders.bean(Foo.class);
Foo foo = new Foo();
foo.f1 = 10;
foo.f2 = IntStream.range(0, 1000000).boxed().collect(Collectors.toList());
foo.f3 = IntStream.range(0, 1000000).boxed().collect(Collectors.toMap(i -> "k"+i, i -> i));

List<Bar> bars = new ArrayList<>(1000000);
for (int i = 0; i < 1000000; i++) {
  Bar bar = new Bar();
  bar.f1 = "s" + i;
  bar.f2 = LongStream.range(0, 10).boxed().collect(Collectors.toList());
  bars.add(bar);
}
foo.f4 = bars;

// Serialize to row format (can be zero-copy read by Python)
BinaryRow binaryRow = encoder.toRow(foo);

// Deserialize entire object
Foo newFoo = encoder.fromRow(binaryRow);

// Zero-copy access to nested fields without full deserialization
BinaryArray binaryArray2 = binaryRow.getArray(1);  // Access f2 field
BinaryArray binaryArray4 = binaryRow.getArray(3);  // Access f4 field
BinaryRow barStruct = binaryArray4.getStruct(10);   // Access 11th Bar element
long value = barStruct.getArray(1).getInt64(5);     // Access nested value

// Partial deserialization
RowEncoder<Bar> barEncoder = Encoders.bean(Bar.class);
Bar newBar = barEncoder.fromRow(barStruct);
Bar newBar2 = barEncoder.fromRow(binaryArray4.getStruct(20));

Python

from dataclasses import dataclass
from typing import List, Dict
import pyarrow as pa
import pyfory

@dataclass
class Bar:
    f1: str
    f2: List[pa.int64]

@dataclass
class Foo:
    f1: pa.int32
    f2: List[pa.int32]
    f3: Dict[str, pa.int32]
    f4: List[Bar]

encoder = pyfory.encoder(Foo)
foo = Foo(
    f1=10,
    f2=list(range(1000_000)),
    f3={f"k{i}": i for i in range(1000_000)},
    f4=[Bar(f1=f"s{i}", f2=list(range(10))) for i in range(1000_000)]
)

# Serialize to row format
binary: bytes = encoder.to_row(foo).to_bytes()

# Zero-copy random access without full deserialization
foo_row = pyfory.RowData(encoder.schema, binary)
print(foo_row.f2[100000])           # Access element directly
print(foo_row.f4[100000].f1)        # Access nested field
print(foo_row.f4[200000].f2[5])     # Access deeply nested field

For more details on row format, see Row Format Specification.

Documentation

User Guides

Guide Description Source Website
Java Serialization Comprehensive guide for Java serialization java πŸ“– View
Python Python-specific features and usage python πŸ“– View
Rust Rust implementation and patterns rust πŸ“– View
C++ C++ implementation and patterns cpp πŸ“– View
Scala Scala integration and best practices scala πŸ“– View
Cross-Language Serialization Multi-language object exchange xlang πŸ“– View
GraalVM Native image support and AOT compilation graalvm_guide.md πŸ“– View
Development Building and contributing to Fory DEVELOPMENT.md πŸ“– View

Protocol Specifications

Specification Description Source Website
Xlang Serialization Cross-language binary protocol xlang_serialization_spec.md πŸ“– View
Java Serialization Java-optimized protocol java_serialization_spec.md πŸ“– View
Row Format Row-based binary format row_format_spec.md πŸ“– View
Type Mapping Cross-language type conversion xlang_type_mapping.md πŸ“– View

Compatibility

Schema Compatibility

Apache Foryβ„’ supports class schema forward/backward compatibility across Java, Python, Rust, and Golang, enabling seamless schema evolution in production systems without requiring coordinated upgrades across all services. Fory provides two schema compatibility modes:

  1. Schema Consistent Mode (Default): Assumes identical class schemas between serialization and deserialization peers. This mode offers minimal serialization overhead, smallest data size, and fastest performance: ideal for stable schemas or controlled environments.

  2. Compatible Mode: Supports independent schema evolution with forward and backward compatibility. This mode enables field addition/deletion, limited type evolution, and graceful handling of schema mismatches. Enable using withCompatibleMode(CompatibleMode.COMPATIBLE) in Java, compatible=True in Python, compatible_mode(true) in Rust, or NewFory(true) in Go.

Binary Compatibility

Current Status: Binary compatibility is not guaranteed between Fory major releases as the protocol continues to evolve. However, compatibility is guaranteed between minor versions (e.g., 0.13.x).

Recommendations:

  • Version your serialized data by Fory major version
  • Plan migration strategies when upgrading major versions
  • See upgrade guide for details

Future: Binary compatibility will be guaranteed starting from Fory 1.0 release.

Security

Overview

Serialization security varies by protocol:

  • Row Format: Secure with predefined schemas
  • Object Graph Serialization (Java/Python native): More flexible but requires careful security configuration

Dynamic serialization can deserialize arbitrary types, which may introduce risks. For example, the deserialization may invoke init constructor or equals/hashCode method; If the method body contains malicious code, the system will be at risk.

Fory enables class registration by default for dynamic protocols, allowing only trusted registered types. Do not disable class registration unless you can ensure your environment is secure.

If this option is disabled, you are responsible for serialization security. You should implement and configure a customized TypeChecker or DeserializationPolicy for fine-grained security control.

To report security vulnerabilities in Apache Foryβ„’, please follow the ASF vulnerability reporting process.

Community and Support

Getting Help

  • Slack: Join our Slack workspace for community discussions
  • Twitter/X: Follow @ApacheFory for updates and announcements
  • GitHub Issues: Report bugs and request features at apache/fory
  • Mailing Lists: Subscribe to Apache Fory mailing lists for development discussions

Contributing

We welcome contributions! Please read our Contributing Guide to get started.

Ways to Contribute:

  • πŸ› Report bugs and issues
  • πŸ’‘ Propose new features
  • πŸ“ Improve documentation
  • πŸ”§ Submit pull requests
  • πŸ§ͺ Add test cases
  • πŸ“Š Share benchmarks

See Development Guide for build instructions and development workflow.

License

Apache Foryβ„’ is licensed under the Apache License 2.0.

Description

  • Swift Tools 6.0.0
View More Packages from this Author

Dependencies

Last updated: Mon Mar 30 2026 10:21:06 GMT-0900 (Hawaii-Aleutian Daylight Time)