# Halcyon demo

> Your own UI: the UI-less client hands you the conversation as data, so every pixel is yours. In a sleep app, the agent’s breathing widget arrives as data and drives the app’s own orb.

Pattern: Your own UI. Brand: Halcyon. Tags: UI-less client, custom widget, own transcript, situational awareness, reduced motion.

## What it shows

- **Your own UI**: the UI-less client (`createAgentConversation`) with the page drawing every bubble, the composer and the status line itself: no Mindset UI on screen
- A custom widget, `halcyon-breathing-timer`, arriving as a `widget-payload` event and drawn as the app’s breathing orb instead of a card
- A composer held closed until the client is ready, announced through an `aria-live` status, as the UI-less reference page teaches
- Situational awareness telling the agent whether a breathing session is running, so it never starts a second one
- A still orb with a text countdown under `prefers-reduced-motion`

## Files

- `demos/halcyon/demo.json`
- `demos/halcyon/widgets/halcyon-breathing-timer.json`
- `demos/halcyon/prompt/policy-rules.md`
- `src/demos/halcyon/index.tsx`
- `src/demos/halcyon/breath.ts`
- `src/demos/halcyon/useBreathing.ts`

## More

- [Source](https://docs4.mindset.ai/demos/halcyon/source)
- [How it works](https://docs4.mindset.ai/demos/halcyon/how)
- [The UI-less client](https://docs4.mindset.ai/docs/sdk/the-ui-less-client)
- [Draw widgets in your own UI](https://docs4.mindset.ai/docs/sdk/draw-widgets-in-your-own-ui)
- [Events reference](https://docs4.mindset.ai/docs/sdk/events-reference)
- [Build a widget](https://docs4.mindset.ai/docs/ams/build-a-widget)
- [How embedding works](https://docs4.mindset.ai/docs/sdk/how-embedding-works)
