Snora
An iced GUI framework that gets out of the way of your application.
Overview
Snora gives an iced application a small, opinionated skeleton
(header, sidebar, body, footer) plus the overlay surfaces it almost
certainly needs (dialog, bottom sheet, context menu, toasts) — and
then steps back. Every slot accepts any iced::Element, so your UI
code stays your UI code.
When to use it
snora is a good fit when you are building:
- a local-first desktop app that runs heavy work alongside an interactive UI (AI inference, dataset converters, file processors);
- an app that needs accessibility correct from day one — RTL layout, theme-aware colors, logical edges baked into the API;
- a standard desktop chrome (header / sidebar / body / footer) with a few overlays.
snora is not the right tool for games, real-time visualization, or web-first applications. See docs/getting-started/05-when-to-use.md for fuller fit guidance.
Quick start
[]
= { = "0.14", = ["tokio"] }
= "0.8"
use ;
use ;
;
That's the whole program. Adding a header, sidebar, and footer is three more chained calls — see docs/getting-started for the step-by-step walk-through, or jump straight to the runnable examples directory for one-shot demos of every overlay and widget.
Features
- Skeleton + injected slots.
AppLayout::new(body).header(h).side_bar(s).footer(f). Each slot is anyiced::Element. No trait to implement, no dispatcher enum to write. - Framework-managed toasts.
Vec<Toast<Message>>on your state, two one-liners (subscription+sweep_expired) for lifetime, intent → theme color, six anchor positions including RTL-aware ones. - One close sink per channel.
on_close_modalsfor dialogs and sheets,on_close_menusfor header / context menus. Wired once. - Vocabulary instead of magic numbers.
SheetSize::Half,SheetEdge::Start,ToastPosition::TopEnd,LayoutDirection::Rtl,Edge::Start— explicit choices, not hardcoded constants. - Navigation widgets out of the box.
app_header,app_side_bar,app_tab_bar,app_breadcrumb, plus dropdown menus and context menus — direction-aware, theme-aware, and entirely opt-in. - Three crates, one umbrella.
snora-coreis the iced-free vocabulary,snora-widgetsis the optional prefab UI parts, andsnorais the engine — applications only depend onsnora.
Design notes
- Accessible by Default and by Design. Layout is described in
logical edges (
Edge::Start/Edge::End); LTR ↔ RTL is one setter onAppLayout. - No silent drops. If you populate an overlay but leave its close
sink
None, the overlay still renders — snora omits only the click-outside backdrop, never the content. - Skeleton, not styling. Snora positions and stacks. The look of your dialog card, the typography of your header — those are your decisions, not ours.
Read more
For the full picture, head to docs/:
- New to snora? Start with Getting started.
- Looking up something specific? Reference and Guides.
- Wanting to contribute? docs/src/contributing/ is for you — and we'd be glad to have you.
Per-release notes live in CHANGELOG.md; the direction of upcoming work is sketched in ROADMAP.md.
Built with iced.