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/main.tsx
import { Box, PerScreen, Surface, Text } from "halo";
import { clock } from "halo/services";

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

export default () => (
  <PerScreen>
    {(screen) => (
      <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>
    )}
  </PerScreen>
);
halo start