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.5"
use ;
use ;
;
That's the whole program. Adding a header, sidebar, and footer is three more chained calls — see docs/getting-started.
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.
SheetHeight::Half,ToastPosition::TopEnd,LayoutDirection::Rtl,Edge::Start— explicit choices, not hardcoded constants. - Two crates, one direction.
snora-coreis the iced-free vocabulary,snorais the engine — an iced upgrade only touches one crate.
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/contributing/ is for you — and we'd be glad to have you.