halo

Desktop widgets for macOS, written in TSX. Native rendering, reactive state, reload on save.

Widgets made with halo

Read the docsExamplesGitHub

Why

Install

brew tap bfpimentel/tap
brew trust --formula bfpimentel/tap/halo   # Homebrew 6+: third-party taps need explicit trust
brew install halo

Nix: inputs.halo.url = "github:bfpimentel/halo" with services.halo.enable = true (nix-darwin or home-manager). Full setup.

A widget

// ~/.config/halo/halo.json
{ "widgets": { "clock": { "widget": "clock", "screens": "all" } } }
// ~/.config/halo/widgets/clock.tsx
import { Box, Surface, Text, type WidgetProps } from "halo";
import { clock } from "halo/services";

const time = clock.format("HH:mm");

export default ({ screen }: WidgetProps) => (
  <Surface screen={screen} anchor={["bottom", "right"]} margins={[0, 16, 16, 0]} layer="desktop">
    <Box style={{ padding: [10, 16], background: "#1e1e2ee0", radius: 12 }}>
      <Text style={{ fontSize: 22, fontWeight: "bold", color: "#cdd6f4" }}>{time}</Text>
    </Box>
  </Surface>
);
halo start