clauddy 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +24 -4
  2. package/auth.js +7 -1
  3. package/main.js +3 -0
  4. package/package.json +15 -1
package/README.md CHANGED
@@ -50,9 +50,13 @@ Plus a welcome **wave** on launch. You can [poke the pet from the terminal](#pla
50
50
 
51
51
  ## Install
52
52
 
53
- macOS (Apple Silicon). Two ways, depending on what you want:
53
+ **macOS (Apple Silicon)** is the first-class build. **Windows (x64)** works too, and **Linux** is next. The `bunx`/`npx` route below runs on all of them today.
54
54
 
55
- ### 1. Install as an app — opens at login (recommended)
55
+ ### macOS
56
+
57
+ Two ways, depending on what you want:
58
+
59
+ #### 1. Install as an app — opens at login (recommended)
56
60
 
57
61
  One command — it downloads the latest release and drops it in `/Applications`:
58
62
 
@@ -64,7 +68,7 @@ curl -fsSL https://raw.githubusercontent.com/renatoaug/claude-usage-monitor/main
64
68
 
65
69
  Why not a normal download? macOS blocks **unsigned** apps downloaded through a browser with a scary *"damaged, move to Trash"* warning — even when they're perfectly safe. It's a false alarm: the only way to silence it is to pay Apple **$99/year** to sign + notarize, which a free hobby app skips. Files fetched with `curl` aren't flagged, so this method simply **lets your Mac open the app** without the block. It then registers in **Login Items** and starts with your Mac — set it and forget it.
66
70
 
67
- ### 2. Run it via `bunx` (no install)
71
+ #### 2. Run it via `bunx` (no install)
68
72
 
69
73
  Needs [Bun](https://bun.sh) (or use `npx` with Node 24):
70
74
 
@@ -74,7 +78,23 @@ bunx clauddy
74
78
 
75
79
  The first run downloads Electron, so give it a moment. Handy for a quick run, but it stays up **only while that command is open** and won't start on its own. Quit it with the **×** button.
76
80
 
77
- > The app keeps its data in `~/.claude-usage-monitor`, regardless of how you run it.
81
+ ### Windows (x64)
82
+
83
+ The quickest path works the same as macOS — with [Bun](https://bun.sh) or Node 24 installed:
84
+
85
+ ```powershell
86
+ bunx clauddy # or: npx clauddy
87
+ ```
88
+
89
+ Prefer a standalone app with no Node/Bun? Grab the **portable zip** (`Clauddy-<version>-win.zip`) from the [latest release](https://github.com/renatoaug/claude-usage-monitor/releases), unzip it anywhere, and run `Clauddy.exe`. Because the app is unsigned, Windows **SmartScreen** shows a "Windows protected your PC" prompt the first time — click **More info → Run anyway**. From then on it starts with Windows.
90
+
91
+ > Windows builds are produced by the **Build** workflow (Actions ▸ Build) — attaching them to every release automatically is on the roadmap.
92
+
93
+ ### Linux
94
+
95
+ Coming soon — the build is already wired for `tar.gz` and AppImage. In the meantime, `bunx clauddy` / `npx clauddy` works today.
96
+
97
+ > The app keeps its data in `~/.claude-usage-monitor`, regardless of platform or how you run it.
78
98
 
79
99
  ## Controls
80
100
 
package/auth.js CHANGED
@@ -124,7 +124,13 @@ async function refresh() {
124
124
  client_id: CLIENT_ID,
125
125
  }),
126
126
  })
127
- if (!res.ok) throw Object.assign(new Error('refresh failed'), { status: res.status })
127
+ if (!res.ok) {
128
+ // a rejected grant (expired/revoked refresh token) means the session is
129
+ // dead — surface it as 401 so callers clear the token and prompt login.
130
+ // transient failures (429, 5xx) keep their status so we retry, not logout.
131
+ const dead = res.status === 400 || res.status === 403
132
+ throw Object.assign(new Error('refresh failed'), { status: dead ? 401 : res.status })
133
+ }
128
134
  const j = await res.json()
129
135
  save({
130
136
  access_token: j.access_token,
package/main.js CHANGED
@@ -101,6 +101,7 @@ function createWindow() {
101
101
  y: workAreaSize.height - H - 24,
102
102
  frame: false,
103
103
  transparent: true,
104
+ backgroundColor: '#00000000', // fully transparent — Windows needs this or the window paints black
104
105
  resizable: false,
105
106
  alwaysOnTop: true,
106
107
  skipTaskbar: true,
@@ -265,6 +266,8 @@ ipcMain.on('save-config', (_e, patch) => {
265
266
  ipcMain.on('quit', () => app.quit())
266
267
 
267
268
  app.whenReady().then(() => {
269
+ // Windows toast notifications need an explicit AppUserModelID to show reliably
270
+ if (process.platform === 'win32') app.setAppUserModelId('app.clauddy')
268
271
  createWindow()
269
272
  // open at login (packaged app only)
270
273
  if (app.isPackaged) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clauddy",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "A cute desktop pet that tracks your Claude Code usage",
5
5
  "main": "main.js",
6
6
  "bin": {
@@ -19,6 +19,8 @@
19
19
  "start": "electron .",
20
20
  "pack": "node scripts/build-app.js --dir",
21
21
  "dist": "node scripts/build-app.js --mac zip",
22
+ "dist:win": "node scripts/build-app.js --win zip",
23
+ "dist:linux": "node scripts/build-app.js --linux",
22
24
  "icon": "bash build-icon.sh",
23
25
  "gifs": "electron tools/capture/capture.js",
24
26
  "format": "biome format --write .",
@@ -73,6 +75,18 @@
73
75
  "target": "dir",
74
76
  "identity": null,
75
77
  "icon": "build/icon.icns"
78
+ },
79
+ "win": {
80
+ "target": "zip",
81
+ "icon": "build/icon.ico"
82
+ },
83
+ "linux": {
84
+ "target": [
85
+ "tar.gz",
86
+ "AppImage"
87
+ ],
88
+ "category": "Utility",
89
+ "icon": "build/icon.png"
76
90
  }
77
91
  },
78
92
  "dependencies": {