v0.1.0

Carthage
Framework

Cross-platform application framework. GPU-accelerated rendering. Real-time audio. Desktop + Mobile.

What is Carthage?

Carthage is a hybrid Rust + C++ application framework designed for building high-performance, GPU-accelerated applications across desktop and mobile platforms.

Unlike traditional frameworks, Carthage prioritizes zero-overhead abstractions, native performance, and cross-platform compatibility without sacrificing developer ergonomics.

Technology

Rust + C++

UI logic in Rust. Audio DSP in C++. Connected via zero-overhead CXX bridge.

Rendering

Vello + WGPU

GPU-accelerated 2D vector graphics. Metal, Vulkan, DX12 backends.

Platforms

Universal

macOS, Windows, Linux, Android, iOS. Single codebase.

Core Features

GPU Rendering
Vello vector graphics with WGPU backend
Real-time Audio
C++ DSP engine with atomic parameters
Audio Feedback
Lock-free queue for meter values & FFT data
Material 3 UI
8 themed widgets (Button, Slider, Knob...)
Thread-Safe State
Atomic parameters & lock-free queues
Mobile Builds
Android APK + iOS staticlib with build scripts

Material 3 Widgets

8 production-ready UI components with consistent theming and interaction states.

Material 3 Widgets Showcase
01

Button

Elevated, filled, and outlined variants with hover/press states

02

Slider

Horizontal parameter control with smooth drag interaction

03

Fader

Vertical volume control with gradient fill indicator

04

Toggle

Animated switch for binary on/off states

05

Card

Elevated surface container for grouping related content

06

Meter

Level visualization for audio feedback and monitoring

07

TextField

Text input with label, focus states, and validation

08

Knob

Rotary control for precise parameter adjustments

Using Widgets in Your App
use carthage_ui::widgets::*;

fn view(&self, ctx: &mut ViewContext) {
    // Draw a themed button
    Button::new("Play")
        .position(100.0, 100.0)
        .draw(&mut ctx.scene, &ctx.theme);
    
    // Draw a vertical fader
    Fader::new(0.8)
        .position(200.0, 100.0)
        .height(200.0)
        .draw(&mut ctx.scene, &ctx.theme);
    
    // Draw a meter for audio feedback
    if let Some(feedback) = &ctx.audio_feedback {
        Meter::new(feedback.peak_left)
            .position(300.0, 100.0)
            .draw(&mut ctx.scene, &ctx.theme);
    }
}