A lightweight macOS menu bar app that visualises your Screen Time data. No cloud, no Python, no server — everything stays on your Mac.
Built with Tauri v2 (Rust backend + system WKWebView). The entire app bundle is ~6 MB.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
macOS has a Screen Time panel in System Settings, but it is designed for parental controls and gives you almost no analytical power as a regular user:
- No history beyond a week — you cannot look back more than 7 days
- No daily goal tracking — no threshold line, no streak, no success rate
- No notifications — it won't warn you when you are halfway through your daily budget
- No data export — you cannot get your usage data out in any form
- No per-app history — you can't see how a single app's usage has changed over time
- No menu bar access — you have to dig into System Settings every time
Screenlog reads the same underlying database that macOS populates, adds its own lightweight storage layer, and surfaces everything in a persistent menu bar dashboard.
- Menu bar app — no Dock icon; click the tray icon to show or hide the window
- Automatic collection — gathers data on startup, every hour, and on every wake from sleep
- Multi-device — Mac, iPhone, and iPad usage shown together with per-device colours; click device pills to hide individual devices from charts
- Merge overlaps — header toggle that deduplicates simultaneous multi-device usage so time is never counted twice
- Daily goal — set a target in hours; a threshold line appears on the chart and KPI cards track your success rate and streak
- Screen time warnings — optional notifications at 50% and 100% of your daily goal
- App drill-down — click any bar in the Overview to see that app's full daily history, coloured by device
- App renaming — give any app a friendlier display name
- Export — back up the database or export the current view as CSV
- Dark mode — follows system appearance, or force Light / Dark in Settings
- Launch at login — optional, configured in Settings
- Secure — reads Apple's database read-only, all data stays local
- macOS 12 (Monterey) or later
- Rust +
@tauri-apps/cli(build from source only)
Download the latest Screenlog-*.dmg from Releases, open it, and drag Screenlog.app to your Applications folder.
First launch: macOS will show "Screenlog cannot be verified" because the app is not notarised. To open it: right-click → Open, then click Open in the dialog. After that it launches normally. Alternatively, run:
xattr -cr /Applications/Screenlog.app
git clone https://github.com/r-erd/screenlog.git
cd screenlog
npm install # installs @tauri-apps/cli
npm run build # compiles the Rust backend + bundles the appThe built app will be at src-tauri/target/release/bundle/macos/Screenlog.app.
Rust required. If you don't have Rust installed:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env
On first launch, Screenlog shows a setup screen asking for Full Disk Access.
Apple's Screen Time database (~/Library/Application Support/Knowledge/knowledgeC.db) is protected by macOS privacy controls. Full Disk Access is required to read it.
- Click Open System Settings in the app
- Go to Privacy & Security → Full Disk Access
- Enable access for Screenlog
- Click Check Again in the app
Open Settings (⚙) and enter a target in hours under Daily Goal. Once set:
- A red dashed threshold line appears on the Daily chart
- ✓ tick marks appear above bars that meet the goal (toggle in Settings)
- Four KPI cards show days on target, success rate, and streaks
- Enable Screen time warnings in Settings → Notifications to get notified at 50% and 100% of your goal
In the Overview chart, single-click any bar to open a daily history chart for that app. Double-click to rename it.
| Section | Options |
|---|---|
| Appearance & System | Light / Dark / System appearance; Launch at login |
| Daily Goal | Set or clear a daily screen time target; toggle tick marks |
| Notifications | Screen time warnings at 50% and 100% of goal |
| Data | Export DB backup, import backup, export current view as CSV |
| Devices | List of devices with data; rename any device |
| Grafana Push | Push data to a PostgreSQL database for Grafana dashboards |
| Collection History | Log of every collection run with row counts and errors |
Screenlog reads iPhone and iPad screen time from Apple Biome — a local cache of iCloud-synced data stored at ~/Library/Biome/. This requires Full Disk Access (same permission needed for Mac data) and works on macOS 13+.
To get iPhone/iPad data:
- On your iPhone/iPad: Settings → Screen Time → Share Across Devices → enable it
- Make sure iCloud sync has had time to push data to your Mac (usually within minutes)
- Click Collect now in Screenlog — iPhone and iPad usage will appear in the charts
Each physical device appears as a separate colour in the charts. You can rename devices in Settings → Devices.
Device filter pills appear below the tabs when data from multiple devices is present. Click any pill to hide that device from all charts; click again to bring it back.
Merge overlaps (toggle in the header) deduplicates minutes where multiple devices were active simultaneously. When enabled, device pills are hidden and every chart shows a single merged total — useful if you often have your iPhone and Mac open at the same time.
Screenlog can push daily screen time totals to a PostgreSQL database so you can build Grafana dashboards on top of your data.
- A running PostgreSQL instance reachable from your Mac (e.g. a home server)
- A Grafana instance with the PostgreSQL data source plugin (built-in, no extra install needed)
CREATE DATABASE screenlog;
CREATE USER screenlog WITH PASSWORD 'your-password';
GRANT ALL PRIVILEGES ON DATABASE screenlog TO screenlog;
-- PostgreSQL 15+: also grant schema privileges
\c screenlog
GRANT ALL ON SCHEMA public TO screenlog;Open Settings → Grafana Push and fill in:
| Field | Example |
|---|---|
| Host | homeserver.local |
| Port | 5432 |
| Database | screenlog |
| User | screenlog |
| Password | your-password |
Click Test connection to verify, then Push all data to do the initial sync. Enable Auto-push after collection to keep Grafana up to date automatically.
Screenlog creates the table automatically on first push:
CREATE TABLE screenlog_daily (
day DATE NOT NULL,
app TEXT NOT NULL,
device_id TEXT NOT NULL DEFAULT '',
device_type TEXT NOT NULL DEFAULT 'mac', -- mac | iphone | ipad
device_name TEXT NOT NULL DEFAULT 'Mac',
usage_secs BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (day, app, device_id)
);- Connections → Data sources → Add new data source → PostgreSQL
- Set Host URL to your PostgreSQL address (e.g.
homeserver.local:5432) - Set Database, User, Password as above
- Set TLS/SSL Mode to
disable(unless your Postgres has TLS configured) - Click Save & test
Total daily screen time (hours):
SELECT
day AS "time",
SUM(usage_secs) / 3600.0 AS "Total hours"
FROM screenlog_daily
WHERE $__timeFilter(day::timestamp)
GROUP BY day
ORDER BY dayTop apps for the selected period:
SELECT
app,
SUM(usage_secs) / 60 AS "Minutes"
FROM screenlog_daily
WHERE $__timeFilter(day::timestamp)
GROUP BY app
ORDER BY 2 DESC
LIMIT 20Usage split by device type:
SELECT
day AS "time",
device_name,
SUM(usage_secs) / 3600.0 AS "Hours"
FROM screenlog_daily
WHERE $__timeFilter(day::timestamp)
GROUP BY day, device_name
ORDER BY dayTime series panels: set the panel type to Time series, enable Format → Table for the top-apps query.
macOS continuously writes Screen Time data to ~/Library/Application Support/Knowledge/knowledgeC.db. Screenlog reads from that database (read-only, never writes), stores records in its own database at ~/Library/Application Support/com.screenlog.dashboard/screentime.db, and displays them in the dashboard.
Collection runs on startup, every hour, and on every wake from sleep.
- Update
"version"insrc-tauri/tauri.conf.json - Commit and push to main
- Tag the commit and push the tag:
git tag v1.2.0 git push origin v1.2.0
- GitHub Actions builds the DMG and publishes it as a GitHub Release automatically.
knowledgeC.dbis opened read-only — the app never writes to Apple's database- Renderer runs in a sandboxed WKWebView — no Node.js access
- Content Security Policy blocks all external network requests
- Chart.js is bundled locally — nothing is loaded from a CDN
- All data stays on your Mac
All data stays on your Mac by default. Nothing is sent anywhere unless you explicitly configure and trigger the optional Grafana Push feature, which sends data only to the PostgreSQL server you specify.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.





