stickyinc 0.5.2

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 StickyInc contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,377 @@
1
+ ```
2
+ ███████╗████████╗██╗ ██████╗██╗ ██╗██╗ ██╗ ██╗███╗ ██╗ ██████╗
3
+ ██╔════╝╚══██╔══╝██║██╔════╝██║ ██╔╝╚██╗ ██╔╝ ██║████╗ ██║██╔════╝
4
+ ███████╗ ██║ ██║██║ █████╔╝ ╚████╔╝ ██║██╔██╗ ██║██║
5
+ ╚════██║ ██║ ██║██║ ██╔═██╗ ╚██╔╝ ██║██║╚██╗██║██║
6
+ ███████║ ██║ ██║╚██████╗██║ ██╗ ██║ ██║██║ ╚████║╚██████╗
7
+ ╚══════╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝
8
+
9
+ ┌─────────────────────────────────────────────────────────┐
10
+ │ v0.5.2 · the subscription-mode release │
11
+ │ │
12
+ │ ▸ zero-key auto-detect for claude / codex / gemini │
13
+ │ ▸ Ollama + LM Studio localhost fallback, free │
14
+ │ ▸ sidebar hidden until setup is done — subtle bulges │
15
+ │ from the edge on new task / due / setup events │
16
+ └─────────────────────────────────────────────────────────┘
17
+
18
+
19
+ ┌──────────────────────────┐ ┌──────────────────────────┐
20
+ │ user ▸ call the dentist │ MCP │ ☐ call the dentist │
21
+ │ friday afternoon │ ─────▶ │ ☐ email Sarah │
22
+ │ claude ▸ noted, adding. │ tool │ ☑ ship v0.5 │
23
+ └──────────────────────────┘ │ ☐ make it stick │
24
+ │ └──────────────────────────┘
25
+ the chat the pane
26
+ evaporates at close lives in ~/.stickyinc forever
27
+ ```
28
+
29
+ <p align="center">
30
+ <strong>v0.5.2</strong> · MIT · MCP-first · no backend, ever<br />
31
+ <em>Bring your own LLM key — or piggyback on Claude Code, ChatGPT, Gemini, or local Ollama. Zero config either way.</em>
32
+ </p>
33
+
34
+ <p align="center">
35
+ <a href="https://astralchemist.github.io/stickyinc/">Landing page</a> ·
36
+ <a href="https://github.com/Astralchemist/stickyinc/releases/latest">Download</a> ·
37
+ <a href="#the-idea">The idea</a> ·
38
+ <a href="#architecture">Architecture</a> ·
39
+ <a href="#quickstart">Quickstart</a>
40
+ </p>
41
+
42
+ ---
43
+
44
+ ## The idea
45
+
46
+ Every LLM overlay on the market follows the same shape: **summon → ask → dismiss.** You pop a window, ask a thing, close it, and within an hour the answer has evaporated from your brain and the tab. The model is a disposable oracle; you are the durable storage.
47
+
48
+ StickyInc inverts that. Chats are cheap and ephemeral; the *commitment graph* you build from them over months — the promises, deadlines, quiet todos you let slip into conversation — is the part that actually compounds. Nobody was storing it.
49
+
50
+ So StickyInc does two things, and refuses to do anything else:
51
+
52
+ ```
53
+ 1 ▸ catches the commitments
54
+ ───────────────────────
55
+ when you tell an LLM "call the dentist friday", an MCP tool
56
+ call fires and a checkbox appears on your screen. no
57
+ copy-paste, no "remind me later", no second tab.
58
+
59
+ 2 ▸ keeps them in front of you
60
+ ──────────────────────────
61
+ an 8-pixel strip lives on the right edge of your screen.
62
+ hover to expand, click to tick off. the file behind it is
63
+ a local SQLite database you own outright — swap LLMs, swap
64
+ laptops, the graph comes with you.
65
+ ```
66
+
67
+ Everything else — chat UI, OAuth flows, cloud sync, a mobile app — is *intentionally* out of scope. StickyInc is a reification layer. The LLM is the CPU; the pane is the canvas.
68
+
69
+ ---
70
+
71
+ ## Architecture
72
+
73
+ ```
74
+ ┌──────────────────┐ MCP stdio ┌──────────────────┐
75
+ │ Claude Desktop │ ───tool call──▶ │ StickyInc MCP │
76
+ │ Claude Code │ │ (Node, stdio) │
77
+ │ any MCP host │ └────────┬─────────┘
78
+ └──────────────────┘ │ SQL
79
+ ▼
80
+ ┌─────────────────────────┐
81
+ │ ~/.stickyinc/tasks.db │
82
+ │ (SQLite, yours) │
83
+ └─────────────┬───────────┘
84
+ │ notify-rs watcher
85
+ ▼
86
+ ┌────────────────────┐
87
+ │ Pane (Tauri) │
88
+ │ edge-strip, always │
89
+ │ on top, translucent│
90
+ └────────────────────┘
91
+ ```
92
+
93
+ Claude never talks to the pane directly. They share state through SQLite — one source of truth, nothing to sync, no IPC to break.
94
+
95
+ ---
96
+
97
+ ## Install
98
+
99
+ Pre-built binaries ship from every tagged release. Signed and notarized builds arrive in v0.6 (see [SIGNING.md](./SIGNING.md) for the plan).
100
+
101
+ | Platform | File | Notes |
102
+ |---|---|---|
103
+ | macOS (Apple Silicon) | `StickyInc_0.5.1_aarch64.dmg` | ad-hoc signed; Gatekeeper will warn |
104
+ | Windows (x64) — installer | `StickyInc_0.5.1_x64-setup.exe` | NSIS, unsigned — SmartScreen will warn |
105
+ | Windows (x64) — MSI | `StickyInc_0.5.1_x64_en-US.msi` | for group-policy deployment |
106
+ | Linux (Debian/Ubuntu) | `StickyInc_0.5.1_amd64.deb` | `sudo dpkg -i` |
107
+ | Linux (RPM/Fedora) | `StickyInc-0.5.1-1.x86_64.rpm` | `sudo rpm -i` |
108
+ | Linux (portable) | `StickyInc_0.5.1_amd64.AppImage` | `chmod +x` and run |
109
+
110
+ > **[Grab the latest release →](https://github.com/Astralchemist/stickyinc/releases/latest)**
111
+
112
+ First launch pops a one-minute setup wizard: pick an LLM provider, paste a key, confirm the MCP registration. No terminal commands. The MCP server runs on your own Node, so you need [Node.js 22.13+](https://nodejs.org) installed.
113
+
114
+ ### MCP server only (npx)
115
+
116
+ Just want the tools in Claude, no pane? With [Node.js 22.13+](https://nodejs.org):
117
+
118
+ ```bash
119
+ claude mcp add stickyinc -- npx -y stickyinc
120
+ ```
121
+
122
+ For Claude Desktop, add this to `claude_desktop_config.json`:
123
+
124
+ ```json
125
+ {
126
+ "mcpServers": {
127
+ "stickyinc": { "command": "npx", "args": ["-y", "stickyinc"] }
128
+ }
129
+ }
130
+ ```
131
+
132
+ Tasks go to `~/.stickyinc/tasks.db`, the same file the pane reads, so you can add the pane later and they'll be there. Set `STICKYINC_DB` to keep them somewhere else (the pane won't see them): `claude mcp add stickyinc -e STICKYINC_DB=~/work-tasks.db -- npx -y stickyinc`.
133
+
134
+ ---
135
+
136
+ ## Quickstart
137
+
138
+ Already have an installer running? Open any Claude Desktop or Claude Code session and say:
139
+
140
+ > *I need to call the dentist Friday afternoon.*
141
+
142
+ The task appears in your pane before Claude finishes its reply.
143
+
144
+ ### Quick-add without a chat
145
+
146
+ While the pane is running, press **⌘⇧N** (macOS) or **Ctrl+Shift+N** (Windows/Linux). A centered input appears — type, hit Enter, done. Inline dates work, in your local time: `buy bread due:2026-04-25` (9 am) or `call mum due:2026-04-25T15:30`.
147
+
148
+ ---
149
+
150
+ ## MCP tools
151
+
152
+ | Tool | What it does |
153
+ |---|---|
154
+ | `add_task` | Add a todo. Optional `due_at` (ISO date). |
155
+ | `add_task_natural` | Parse free text ("*call dentist Friday 3pm*") via the configured LLM. |
156
+ | `list_tasks` | Return open tasks; silently appends `Done today (N)` so Claude has state continuity. |
157
+ | `list_done` | Return recently completed tasks, optional archive. |
158
+ | `complete_task` | Mark a task done. |
159
+ | `schedule_event` | Create a dated local task. Calendar sync is deferred to Claude's own connector (see below). |
160
+
161
+ ---
162
+
163
+ ## LLM providers
164
+
165
+ `add_task_natural` and the passive extraction daemon work with any of:
166
+
167
+ | Provider | How it authenticates | Detected via | Default model |
168
+ |---|---|---|---|
169
+ | **Claude Code** — your Claude Max / Pro subscription, *no API key* | local `claude` CLI OAuth | `claude` on `$PATH` | `haiku` |
170
+ | **Codex (ChatGPT)** — your ChatGPT Plus / Pro / Team subscription, *no API key* | local `codex` CLI OAuth | `codex` on `$PATH` | whatever `codex` defaults to |
171
+ | **Gemini** — your Google account (Gemini Advanced quota or free tier), *no API key* | local `gemini` CLI OAuth | `gemini` on `$PATH` | whatever `gemini` defaults to |
172
+ | **Local (Ollama / LM Studio)** — fully offline, free, no cloud call at all | — | `:11434` or `:1234` responding | first installed model |
173
+ | **OpenRouter** — one key, ~200 models, cheapest per token | API key | `OPENROUTER_API_KEY` | `anthropic/claude-haiku-4.5` |
174
+ | **Anthropic** (direct) | API key ([console.anthropic.com](https://console.anthropic.com/)) | `ANTHROPIC_API_KEY` | `claude-haiku-4-5-20251001` |
175
+ | **OpenAI** (direct) | API key ([platform.openai.com](https://platform.openai.com/api-keys)) | `OPENAI_API_KEY` | `gpt-4o-mini` |
176
+ | **OpenAI-compatible** (Groq, Together, Fireworks, vLLM…) | API key | config file | — |
177
+
178
+ ### Zero-config path
179
+
180
+ Whatever you already pay for, StickyInc will use it. If any of these are set up on your machine, no key or config is needed:
181
+
182
+ - **Claude Code** (`claude` CLI) — bills to your Claude Max / Pro subscription
183
+ - **OpenAI Codex CLI** (`codex`) — bills to your ChatGPT Plus / Pro / Team subscription
184
+ - **Gemini CLI** (`gemini`) — uses your Google account (Gemini Advanced if you have it)
185
+ - **Ollama** or **LM Studio** running locally — fully free, no cloud round-trip
186
+
187
+ Each subscription CLI call shells out to the tool's print mode (`claude -p` / `codex exec` / `gemini -p`); expect ~1s of subprocess startup per parse. Local-server calls are direct HTTP and cost nothing. Prefer an API key anyway? `export OPENROUTER_API_KEY=sk-or-...` and it wins over auto-detect.
188
+
189
+ ### Resolution priority
190
+
191
+ ```
192
+ 1 · ~/.stickyinc/llm.json (explicit provider wins)
193
+ 2 · OPENROUTER_API_KEY
194
+ 3 · ANTHROPIC_API_KEY
195
+ 4 · OPENAI_API_KEY
196
+ 5 · claude CLI on PATH → Claude Code subscription
197
+ 6 · codex CLI on PATH → ChatGPT subscription (via Codex)
198
+ 7 · gemini CLI on PATH → Google / Gemini Advanced
199
+ 8 · localhost :11434/:1234 → Ollama / LM Studio
200
+ ```
201
+
202
+ ### Config file examples — `~/.stickyinc/llm.json`
203
+
204
+ ```json
205
+ { "provider": "claude-code" }
206
+ ```
207
+ ```json
208
+ { "provider": "claude-code", "model": "sonnet" }
209
+ ```
210
+ ```json
211
+ { "provider": "codex" }
212
+ ```
213
+ ```json
214
+ { "provider": "gemini", "model": "gemini-2.5-flash" }
215
+ ```
216
+ ```json
217
+ { "provider": "local" }
218
+ ```
219
+ ```json
220
+ { "provider": "openrouter", "model": "openai/gpt-4.1-mini" }
221
+ ```
222
+ ```json
223
+ { "provider": "anthropic", "model": "claude-sonnet-4-6" }
224
+ ```
225
+ ```json
226
+ { "provider": "compat", "base_url": "http://localhost:11434/v1", "model": "llama3.2", "api_key": "ollama" }
227
+ ```
228
+
229
+ Override the model on any env-var or auto-detect path with `STICKYINC_MODEL=…`. Each LLM call gives up after 90 seconds; raise that with `STICKYINC_LLM_TIMEOUT_MS=…` if you run a slow local model.
230
+
231
+ ### A note on subscription-mode tradeoffs
232
+
233
+ Both `claude-code` and `codex` providers run a subprocess per call (~500ms–1s of overhead) and share the user's subscription rate limits. For interactive quick-add and the once-per-turn passive daemon this is imperceptible; if you end up in a tight extraction loop, configure a direct API provider instead. Subscription routes also mean StickyInc never touches your auth tokens — they stay in whatever state directory the CLI manages (`~/.claude/`, `~/.codex/`).
234
+
235
+ ---
236
+
237
+ ## Passive extraction (opt-in)
238
+
239
+ A daemon that tails your Claude Code transcripts and auto-surfaces commitments you mention in passing.
240
+
241
+ Turn it on in the setup wizard's last step (re-open setup any time from the pane's **setup** link). The pane then runs it in the background with your configured LLM, stops it when you quit, and writes its output to `~/.stickyinc/watcher.log`. You can also run it by hand:
242
+
243
+ ```bash
244
+ npx -y -p stickyinc stickyinc-watch # or, from a clone: pnpm watch
245
+ ```
246
+
247
+ - Watches `~/.claude/projects/**/*.jsonl` (Claude Code session files).
248
+ - For each new **user** turn (add `--assistant` to include Claude's turns), calls the configured LLM to extract commitments.
249
+ - De-dupes via content fingerprint — "*call the dentist*" won't insert twice if still open.
250
+ - Ignores hypotheticals and past tense. Empty extractions are free (no DB write).
251
+
252
+ **Privacy:** every watched turn is sent to your configured LLM provider. Off by default; you decide when to turn it on.
253
+
254
+ ---
255
+
256
+ ## Calendar — by design, we defer to Claude
257
+
258
+ StickyInc intentionally doesn't ship its own Google OAuth flow. It's the single hardest setup step in the entire product surface, and Claude Desktop already has a battle-tested Google Calendar connector built in.
259
+
260
+ When you want a real calendar event, ask Claude in the same turn. `schedule_event` stores the dated task in StickyInc; Claude creates the calendar entry via its own connector. One less thing for you to set up, one less place your tokens live.
261
+
262
+ ---
263
+
264
+ ## Design axioms
265
+
266
+ ```
267
+ ┌─ BYO LLM key / subscription ───────────────────────────────┐
268
+ │ no backend, no token costs on our side, no rate-limit │
269
+ │ theatre. whatever key you already have, we use. │
270
+ └────────────────────────────────────────────────────────────┘
271
+ ┌─ client-side only ─────────────────────────────────────────┐
272
+ │ conversations never leave your device except to the │
273
+ │ provider you chose. everything else is local. │
274
+ └────────────────────────────────────────────────────────────┘
275
+ ┌─ local SQLite ─────────────────────────────────────────────┐
276
+ │ ~/.stickyinc/tasks.db. sync via iCloud / Dropbox / │
277
+ │ Syncthing if you want. or don't. the file is yours. │
278
+ └────────────────────────────────────────────────────────────┘
279
+ ┌─ MCP-first ────────────────────────────────────────────────┐
280
+ │ StickyInc doesn't build a chat UI. it's the canvas │
281
+ │ Claude writes to. │
282
+ └────────────────────────────────────────────────────────────┘
283
+ ┌─ one source of truth ──────────────────────────────────────┐
284
+ │ the DB. pane and MCP both read/write it; no IPC │
285
+ │ between them; nothing to keep in sync. │
286
+ └────────────────────────────────────────────────────────────┘
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Dev (running from source)
292
+
293
+ ```bash
294
+ git clone https://github.com/Astralchemist/stickyinc
295
+ cd stickyinc
296
+ pnpm install
297
+ pnpm dev # MCP server (stdio)
298
+
299
+ # in another terminal
300
+ cd pane
301
+ pnpm install
302
+ pnpm tauri:dev # pane (edge-strip, always on top)
303
+ ```
304
+
305
+ **Linux dev deps** (Ubuntu 22.04+):
306
+ ```bash
307
+ sudo apt-get install -y \
308
+ libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev \
309
+ librsvg2-dev libxdo-dev libssl-dev build-essential curl wget file
310
+ ```
311
+
312
+ macOS and Windows need only Rust + Node 22.13+. Release builds run through GitHub Actions — see `.github/workflows/build.yml`.
313
+
314
+ ---
315
+
316
+ ## How the pane actually works
317
+
318
+ - Always-on-top, transparent, frameless, `skipTaskbar`. 8px strip glued to the right edge by default.
319
+ - Hover → window resizes to 320px, pane slides in. Click-through everywhere else.
320
+ - Checkbox click → Rust `complete_task` command → SQLite UPDATE → `notify-rs` watcher emits `tasks-changed` → UI re-fetches.
321
+ - Red dot on the strip when any open task is past its `due_at`.
322
+ - Reads/writes the same `~/.stickyinc/tasks.db` as the MCP server. One source of truth.
323
+
324
+ ---
325
+
326
+ ## Roadmap
327
+
328
+ ```
329
+ [x] v0.1 MCP server, SQLite, four tools.
330
+ [x] v0.2 Tauri edge-strip pane.
331
+ [x] v0.3 Recently-done + Archive drawer, list_done, CI,
332
+ LLMProvider (Anthropic + OpenRouter + OpenAI-compat),
333
+ add_task_natural.
334
+ [x] v0.4 Passive extraction daemon, fingerprint dedup,
335
+ done-today feedback in list_tasks.
336
+ [x] v0.5 Global ⌘⇧N quick-add window, full icon set,
337
+ one-click setup wizard, tagged release builds
338
+ for macOS / Windows / Linux.
339
+ [x] v0.5.1 Subscription-mode providers (Claude Code, Codex,
340
+ Gemini, Ollama/LM Studio) with zero-key auto-detect.
341
+ Sidebar hidden until setup is done — subtle bulge
342
+ notifications for new tasks, due crossings, and
343
+ incomplete setup.
344
+
345
+ [ ] v0.6 ▸ in-app auto-updater (check + download + install
346
+ signed bundles on launch; users never miss a fix)
347
+ ▸ wizard reworked to detect claude / codex / gemini
348
+ CLIs and offer zero-key "use my subscription" as
349
+ the default; API key becomes the fallback, not
350
+ the front door
351
+ ▸ signed + notarized macOS installer, signed MSI on
352
+ Windows (see SIGNING.md)
353
+ ▸ UUID task IDs + append-only event log — unlocks
354
+ multi-device sync, undo, and audit history. Done
355
+ on desktop regardless of mobile, because the
356
+ migration is scary later and free now.
357
+
358
+ [ ] v0.7 ▸ phone access without an app: desktop pane serves
359
+ a read-only LAN web view over HTTPS — bookmark
360
+ it on your phone, no store review, no sync engine
361
+ ▸ per-project tasks (separate DBs per Claude Code
362
+ workspace), weekly digest, menu-bar quick-add
363
+
364
+ [ ] v0.8+ ▸ native mobile (Tauri 2 iOS + Android) — viewer,
365
+ quickadd, share-sheet, voice capture via Siri /
366
+ Assistant Shortcuts
367
+ ▸ LAN sync over mDNS + self-signed TLS + QR
368
+ pairing (LocalSend-style). No relay, no backend.
369
+ Filesystem sync (iCloud / Dropbox / Syncthing)
370
+ remains the documented "away from home" path.
371
+ ```
372
+
373
+ ---
374
+
375
+ ## License
376
+
377
+ MIT. Do what you want.