Skip to content

About

A Bauhaus-inspired analog clock screensaver for macOS, built as a native .saver bundle in Swift with no Xcode project.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

25 Commits

Folders and files

Repository files navigation

Formzeit

A quiet macOS screensaver: a native .saver bundle written in Swift, built entirely from the command line with no Xcode project. One face, day and night plates, and no Interface Builder anywhere in the settings panel.

Bauhaus

The face. A flat-colour plate where the numerals and the sixty markers are pressed into the surface, while the hands and centre hub sit raised above it and cast onto it. Both cues come from one fixed light: a recess catches a pale rim on its lower-right inner wall, a raised part throws its shadow the other way. The hands are white batons with a recessed lume channel; the hub is four stacked layers. Underneath it all is a fine plaster grain, at a strength you can actually see. That texture is what keeps a flat fill from reading as a computer-drawn circle.

Nine plates:

Lagoon
Lagoon
Pistachio
Pistachio
Cream
Cream
Sky
Sky
Salmon
Salmon
Yellow
Yellow
Lilac
Lilac
Stone
Stone
Slate
Slate

With "Follow the day" on, the dial switches to a night plate between 22:00 and 07:00: plain Slate, or one of five lume plates, where the depth model inverts. By day a mark is a recess catching an external light. On a lume plate the marks are the light: they glow, the hands' channel glows with them, and the baton bodies drop to a muted steel so they don't outshine the lume they carry.

Night plates

The second hand and the hub's boss ring take their colour from Accent. With Adaptive, each light plate gives the second hand its own hue (red on Lagoon, blue on Cream) and the hub matches the other two hands. The six fixed hues tint both, with the dark bearing ring and pale centre dome kept inside the colour and the white collar framing it outside. A fixed hue is made darker or lighter where necessary, so the second hand always shows at 3:1 contrast or more against the plate.

Hands come in four styles. Baton is the original described above. The other three are taken from real clocks and are printed in the plate's own ink, like the numerals, so they turn light on a dark plate and glow on a lume plate:

  • Station, after Hans Hilfiker's Swiss railway clock: tapered bars with tails, no hub, and a second hand with a disc near its tip.
  • Desk, after Dietrich Lubs' Braun wall clocks: straight batons, a flat cap with a fine knurled edge, and a flat cap in the second hand's colour.
  • Kitchen, after Max Bill's Junghans kitchen clock: lance-tipped hands with crisp shadows, and a raised hub with a pin hole.
Baton
Baton
Station
Station
Desk
Desk
Kitchen
Kitchen

At night, on the lume plates:

Hand styles at night

Presets at the top of the settings panel set the colours in one tap: Pool, Paper, Primary, Harbor and Dusk each pair a day plate with a night plate that suits it. A preset only writes the normal settings, so you can change any of them after.

Features

  • Nine day plates: Lagoon, Pistachio, Cream, Sky, Salmon, Yellow, Lilac, Stone, Slate. Six night plates: Slate plus Green, Blue, Amber, Red and Lavender lume.
  • Four hand styles: Baton, Station, Desk and Kitchen.
  • Seven accents for the second hand and hub: Adaptive plus Amber, Vermilion, Cobalt, Violet, Verdigris and Bone.
  • Three movements: Quartz (1 Hz tick with a damped-spring overshoot-and-settle), Mechanical (stepped sweep), Sweep (continuous).
  • 12 or 24 hours. With 24-hour time on, the dial itself becomes a 24-hour dial: the hour hand goes around once a day, with 12 at the bottom.
  • A native settings panel with a live preview. The night-plate row appears only when there is a swap to make: not with "Follow the day" off, and not when the day plate is already dark.
  • Burn-in aware: the whole composition drifts slowly, and brightness eases down after a long idle stretch, to a floor rather than to black.
  • Day and night: "Follow the day" switches to the night plate between 22:00 and 07:00. The face does not dim with the hour: multiplying a flat pastel toward black produces grey mud, not a darker mint, so it changes plate instead.

Requirements

  • macOS 12 (Monterey) or later

There are two ways to get Formzeit running. Building from source has no extra steps; downloading the prebuilt release has one required extra step, explained below.

Option A: Download a prebuilt release (one extra step)

Grab the .zip from the latest release, unzip it, and drag Formzeit.saver into ~/Library/Screen Savers/ (create the folder if it doesn't exist).

This is not a notarized build, so macOS will not let it load as downloaded. This isn't a hypothetical warning. It's what actually happens, verified by simulating a real browser download end to end:

  • spctl assesses the bundle as rejected (expected: it's ad-hoc signed only, no Apple Developer ID). This stays true even after the fix below; it isn't the thing that's actually blocking you.

  • What does block it is the quarantine flag macOS attaches to anything downloaded from a browser. With that flag present, the bundle fails to load at all. Selecting it in System Settings just won't show a working preview, with no error dialog explaining why.

  • The fix is to clear that flag, which is the specific thing that's blocking it (confirmed: the bundle loads successfully immediately after this, even though spctl alone still reports "rejected"):

    xattr -dr com.apple.quarantine ~/Library/Screen\ Savers/Formzeit.saver

Then open System Settings → Screen Saver and select Formzeit.

Option B: Build from source (no extra step, needs Xcode CLI tools)

git clone https://github.com/tilakp/formzeit-screensaver.git
cd formzeit-screensaver
./build.sh -i

This compiles the bundle from source, ad-hoc code-signs it, installs it to ~/Library/Screen Savers/Formzeit.saver, and restarts the system's screensaver host processes so the new build actually gets picked up (macOS otherwise keeps a stale copy loaded in memory). Then open System Settings → Screen Saver and select Formzeit.

A build-from-source bundle never gets the quarantine flag in the first place (it was never downloaded), so it just works with no Gatekeeper step. This requires Xcode Command Line Tools, xcode-select --install if you don't already have swiftc/clang. A full Xcode install is not required.

Both options produce the same ad-hoc-signed bundle. Neither is notarized, because that requires a paid Apple Developer Program membership ($99/year). The only difference between the two options is whether the file passed through a browser download and picked up a quarantine flag along the way.

Development

  • ./preview.sh [seconds] [width] [height] [--preview|--config]: renders the current build straight to a PNG in screenshots/, without going through System Settings. The fast loop for iterating on the visual design. --config screenshots the settings sheet instead of the clock face. To preview a plate other than whatever's currently saved, write it with defaults -currentHost write com.tilakpatel.formzeit bauhausPalette -string "sky" beforehand, and put your own value back afterward. Plates are the bauhausPalette key (lagoon, pistachio, cream, sky, salmon, yellow, lilac, stone, slate) and bauhausNightPalette (slate, lumeGreen, lumeBlue, lumeAmber, lumeRed, lumeLavender). Add --layers to capture the CALayer tree rather than drawRect. The saver composites its cached face and its live hands as two layers, and the default capture path exercises an offscreen fallback instead of the code that actually runs on screen.

How it's built

There's no .xcodeproj. build.sh drives the toolchain directly:

  1. swiftc compiles the sources in Sources/ with whole-module optimization to a single object file.
  2. clang -bundle links it as a loadable bundle (the Mach-O type a .saver needs).
  3. The object is packaged into the Formzeit.saver structure alongside Info.plist.
  4. codesign --sign - ad-hoc signs the bundle.

ScreenSaverView's configureSheet is a plain programmatic NSWindow (see Sources/ConfigureSheetController.swift) rather than a .xib, which is what makes building without Xcode possible at all.

License

MIT. See LICENSE.

About

A Bauhaus-inspired analog clock screensaver for macOS, built as a native .saver bundle in Swift with no Xcode project.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages