Skip to main content
Freya Logo

Welcome to Freya

Freya is a cross-platform, native, declarative GUI library for Rust 🦀 powered by Skia. Build beautiful, performant desktop applications with a modern component-based architecture that automatically re-renders when state changes. Freya combines the power of Rust’s safety guarantees with Skia’s battle-tested graphics engine to deliver smooth, native experiences on Windows, macOS, and Linux.

Quick Start

Build your first counter app in minutes

Installation

Set up your development environment

Components

Explore built-in UI components

Examples

Browse 100+ real-world examples

Why Freya?

Declarative & Reactive

Write UI code that’s easy to understand and maintain. Components automatically update when state changes - no manual DOM manipulation required.
fn app() -> impl IntoElement {
    let mut count = use_state(|| 0);

    rect()
        .center()
        .expanded()
        .child(
            Button::new()
                .on_press(move |_| *count.write() += 1)
                .child(format!("Clicked {} times", count.read()))
        )
}

Powered by Skia

Leverage the same graphics engine used by Chrome, Android, and Flutter. Get smooth animations, advanced rendering effects, and consistent cross-platform visuals.

Rich Feature Set

State Management

Local state with use_state and global state with freya-radio

Smooth Animations

Built-in animation system with easing functions

Routing

Type-safe navigation with freya-router

Text Editing

Rich text editing with cursor management and selection

Code Editor

Full-featured code editor with syntax highlighting

Internationalization

Multi-language support with Fluent

WebView Integration

Embed web content in native apps

Terminal Emulation

Full PTY support for terminal apps

Testing

Headless testing framework included

Key Features

Component System

Freya’s component model lets you create reusable UI elements. Components can hold internal state or subscribe to shared state, and they produce UI as their output.
#[derive(PartialEq)]
struct Counter(i32);

impl Component for Counter {
    fn render(&self) -> impl IntoElement {
        let mut count = use_state(|| self.0);

        Button::new()
            .on_press(move |_| *count.write() += 1)
            .child(format!("Count: {}", count.read()))
    }
}

Built-in Components

Freya includes a comprehensive library of ready-to-use components:
  • Basic: Button, Switch, Slider, Input, Checkbox
  • Advanced: VirtualScrollView, Calendar, ColorPicker, Dropdown
  • Layout: Containers with flexbox-like positioning
  • Media: Image, SVG, GIF support

Smooth Animations

Create fluid transitions for colors, sizes, positions, and more with full control over timing and easing.
fn app() -> impl IntoElement {
    let mut animation = use_animation(|_| 
        AnimColor::new((246, 240, 240), (205, 86, 86)).time(400)
    );

    rect()
        .background(&*animation.read())
        .child(
            Button::new()
                .on_press(move |_| animation.start())
                .child("Animate")
        )
}

Developer Experience

  • Fast Compile Times: Optimized for quick iteration
  • Hot Reload: See changes instantly during development
  • DevTools: Inspect component tree in real-time
  • Type Safety: Catch errors at compile time with Rust

Community & Support

Discord Community

Join our Discord server for help and discussions

GitHub Repository

Star the repo and contribute to development

API Documentation

Comprehensive API reference on docs.rs

Sponsor the Project

Support ongoing development

Ready to Get Started?

Follow our installation guide to set up your development environment, then build your first app with our quick start tutorial.

Build docs developers (and LLMs) love