Skip to content

Qualm

macOS menu bar screen-time app that asks Kev or Jev whether each screen breaks your rules and steps in with a pop-up.

ServicebetaGPL-3.0-or-later

Overview

Qualm is a local-first screen-time app for Apple silicon Macs. It reads the screen as text through the Accessibility API and, on each new screen, asks a System One model what kind of page it is, whether it is for learning, work or entertainment, whether it is private, and how likely it breaks each of your rules. Rules are sentences rather than site lists, so a YouTube lecture can stay while Shorts get a pop-up. Plain code decides from the probabilities.

By default it runs Kev-4B locally via MLX (about 1 s per check, nothing leaves the Mac); hosted Jev 1.13 is an opt-in alternative at about 0.2 s and, per the README, around $1 a month, and is never a silent fallback. It never intervenes on payment, login or banking pages. A list summary reports that on 119 trial pages with Kev, the short-video, feed, livestream and video rules had precision 1.00. Rule changes can be made through Claude Code, Codex or Cursor.

What the decision model decides

TypeQuestionAnswers
ChoiceHow likely does this screen break each user rule (e.g. 'short videos made for endless swiping')?—
Yes / noIs this a payment, login or banking screen?—
ChoiceIs this page for learning, work or entertainment?learning · work · entertainment

How it works

  1. Read the new screen as text via the Accessibility API
  2. Ask Kev (local) or Jev (hosted) typed questions per rule plus a sensitive-page check
  3. Skip intervention on sensitive pages
  4. Show a pop-up only when a rule's probability clears its threshold; user answers tune thresholds

Strengths

  • Default local model keeps screen text on the Mac
  • Rules in plain language catch unlisted sites
  • No intervention on sensitive pages by design

Caveats

  • App is not notarized yet
  • Local model needs M1+, macOS 14 and 6-7 GB free memory
  • Precision figure is from a small 119-page trial

Getting started

Download Qualm.dmg from GitHub Releases and pick Kev or Jev in setup; from source: uv sync && uv run qualm setup && uv run qualm app.

At a glance

Type
Service
Status
beta
Language
Python
Runtime
macOS menu bar app
Has code
yes
License
GPL-3.0-or-later

Use cases and integrations

How curated lists describe it

  • Digital wellbeing: macOS menu bar app that reads the screen as text through the Accessibility API and asks Jev (or Kev, its local open-source counterpart) one `Choice` per user rule plus a `Noul` on whether the page is a payment, login or banking screen, stepping in with a pop-up only when a rule's probability clears its threshold and never on sensitive pages; on 119 trial pages with Kev, the short-video, feed, livestream and video rules had precision 1.00.

    yibie/awesome-jev

Frequently asked questions

What does Qualm decide?

Whether the current screen breaks one of your sentence-style rules and whether it is a sensitive page to leave alone.

Does it need a TypeSafe key?

No; the default is the local Kev model. Jev is optional and needs a key.

What leaves my Mac?

With Kev, only a daily update check; with Jev, the text of each new screen goes to TypeSafe.

Related projects

  • Focus mode for Omarchy/Hyprland that has Jev judge each screen against your declared task and escalates gently when you drift.

    Projectbeta
  • Self-hosted podcast ad remover that transcribes episodes and uses an LLM or System One to detect and cut ad segments.

    Servicebeta
  • Chrome extension that asks Jev to score YouTube videos as likely time-wasters and covers them with a dismissible shield.

    Browser extensionprototypeJavaScript
  • Prompt reviewer for Claude Code and Codex where Jev decides whether each prompt needs review before a light model lists blind spots.

    CLIbetaTypeScript
  • IDE and browser extensions to find and install agent Skills and Subagents, with an opt-in Jev check when local detection can't decide.

    Browser extensionproductionTypeScript
  • Chrome extension that groups and orders all tabs in a window by meaning and your rules with a single Jev request.

    ServiceproductionTypeScript