stickyinc 0.5.2 → 0.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.
package/README.md CHANGED
@@ -5,42 +5,68 @@
5
5
  ╚════██║ ██║ ██║██║ ██╔═██╗ ╚██╔╝ ██║██║╚██╗██║██║
6
6
  ███████║ ██║ ██║╚██████╗██║ ██╗ ██║ ██║██║ ╚████║╚██████╗
7
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
8
  ```
28
9
 
29
10
  <p align="center">
30
- <strong>v0.5.2</strong> · MIT · MCP-first · no backend, ever<br />
11
+ <strong>Tell Claude what you need to do. It sticks to the edge of your screen.</strong><br />
12
+ StickyInc is an MCP server plus a thin always-on-top strip. Mention a commitment in any chat, like <em>"call the dentist Friday"</em>, and it becomes a checkbox you can see, kept in a local SQLite file you own.
13
+ </p>
14
+
15
+ <p align="center">
16
+ <img src="docs/demo.gif" width="720" alt="A Claude chat: the user types 'I need to call the dentist Friday afternoon', and the task appears on the StickyInc strip at the right edge of the screen." />
17
+ </p>
18
+
19
+ <p align="center">
20
+ <strong>v0.6.0</strong> · MIT · MCP-first · no backend, ever<br />
31
21
  <em>Bring your own LLM key — or piggyback on Claude Code, ChatGPT, Gemini, or local Ollama. Zero config either way.</em>
32
22
  </p>
33
23
 
34
24
  <p align="center">
35
- <a href="https://astralchemist.github.io/stickyinc/">Landing page</a> ·
25
+ <a href="#setup">Setup</a> ·
36
26
  <a href="https://github.com/Astralchemist/stickyinc/releases/latest">Download</a> ·
27
+ <a href="https://astralchemist.github.io/stickyinc/">Landing page</a> ·
37
28
  <a href="#the-idea">The idea</a> ·
38
- <a href="#architecture">Architecture</a> ·
39
- <a href="#quickstart">Quickstart</a>
29
+ <a href="#architecture">Architecture</a>
40
30
  </p>
41
31
 
42
32
  ---
43
33
 
34
+ ## Setup
35
+
36
+ **1 · Add the MCP server to your client.** You need [Node.js 22.13+](https://nodejs.org); `npx` fetches StickyInc on first run.
37
+
38
+ **Claude Code**
39
+
40
+ ```bash
41
+ claude mcp add -s user stickyinc -- npx -y stickyinc
42
+ ```
43
+
44
+ **Claude Desktop**: Settings → Developer → Edit Config, then add to `claude_desktop_config.json`:
45
+
46
+ ```json
47
+ {
48
+ "mcpServers": {
49
+ "stickyinc": { "command": "npx", "args": ["-y", "stickyinc"] }
50
+ }
51
+ }
52
+ ```
53
+
54
+ **Cursor**: add to `~/.cursor/mcp.json` (every project) or `.cursor/mcp.json` (one project):
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "stickyinc": { "command": "npx", "args": ["-y", "stickyinc"] }
60
+ }
61
+ }
62
+ ```
63
+
64
+ Restart the client and tell it something you need to do: *"remind me to call the dentist Friday afternoon."* If Claude Desktop or Cursor can't find `npx`, put its full path (from `which npx`) in `command`.
65
+
66
+ **2 · Get the strip.** The server saves tasks to `~/.stickyinc/tasks.db`; the pane is the strip that shows them. [Install the pane](#install-the-pane) for macOS, Windows, or Linux. Its setup wizard can also do step 1 for Claude Code.
67
+
68
+ ---
69
+
44
70
  ## The idea
45
71
 
46
72
  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.
@@ -94,43 +120,23 @@ Claude never talks to the pane directly. They share state through SQLite — one
94
120
 
95
121
  ---
96
122
 
97
- ## Install
123
+ ## Install the pane
98
124
 
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).
125
+ Pre-built binaries ship from every tagged release. Builds are unsigned for now; [SIGNING.md](./SIGNING.md) has the plan for signed and notarized ones.
100
126
 
101
127
  | Platform | File | Notes |
102
128
  |---|---|---|
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 |
129
+ | macOS (Apple Silicon) | `StickyInc_<version>_aarch64.dmg` | ad-hoc signed; Gatekeeper will warn |
130
+ | Windows (x64) — installer | `StickyInc_<version>_x64-setup.exe` | NSIS, unsigned — SmartScreen will warn |
131
+ | Windows (x64) — MSI | `StickyInc_<version>_x64_en-US.msi` | for group-policy deployment |
132
+ | Linux (Debian/Ubuntu) | `StickyInc_<version>_amd64.deb` | `sudo dpkg -i` |
133
+ | Linux (RPM/Fedora) | `StickyInc-<version>-1.x86_64.rpm` | `sudo rpm -i` |
134
+ | Linux (portable) | `StickyInc_<version>_amd64.AppImage` | `chmod +x` and run |
109
135
 
110
136
  > **[Grab the latest release →](https://github.com/Astralchemist/stickyinc/releases/latest)**
111
137
 
112
138
  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
139
 
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
140
  ---
135
141
 
136
142
  ## Quickstart
@@ -145,19 +151,69 @@ The task appears in your pane before Claude finishes its reply.
145
151
 
146
152
  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
153
 
154
+ ### Reminders
155
+
156
+ While the pane runs, you get a notification a day before a task is due and again when it's due (StickyInc asks for permission the first time). They follow your system's Do Not Disturb and Focus settings. A task due within a day, or overdue, offers **Snooze 1h** or **tomorrow** (9 am) when you hover it, and the "Due now" pop-out at the screen edge opens the pane when clicked.
157
+
148
158
  ---
149
159
 
150
160
  ## MCP tools
151
161
 
152
162
  | Tool | What it does |
153
163
  |---|---|
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. |
164
+ | `add_task` | Add a todo. Optional `due_at`: the user's words (*"Friday 3pm"*, *"tomorrow"*) or ISO 8601. |
165
+ | `add_task_natural` | Parse free text ("*call dentist Friday 3pm*"): the configured LLM finds the task and the words that say when. |
156
166
  | `list_tasks` | Return open tasks; silently appends `Done today (N)` so Claude has state continuity. |
157
167
  | `list_done` | Return recently completed tasks, optional archive. |
168
+ | `sticky_search` | Search every task, open and done, by the words in it or the words it came from; filter by `status` and `since` (*"3 weeks ago"*). Up to 20, best match first, each with when it was added. |
158
169
  | `complete_task` | Mark a task done. |
159
170
  | `schedule_event` | Create a dated local task. Calendar sync is deferred to Claude's own connector (see below). |
160
171
 
172
+ ### Prompts
173
+
174
+ Three ready-made prompts, for day-one value without writing any: they appear wherever your client lists MCP prompts (in Claude Code, as `/mcp__stickyinc__morning_review` and so on). Each fills itself in with your tasks and ends with a numbered action list.
175
+
176
+ | Prompt | What it does |
177
+ |---|---|
178
+ | `morning_review` | Overdue, due today, due this week, and your oldest undated tasks: what matters today, and an action list for it. |
179
+ | `overdue` | Each overdue task with when you added it and what you said: do it now, reschedule it, or drop it. |
180
+ | `weekly_closeout` | The week's done, added, slipped and due-next tasks, and an action list for next week. |
181
+
182
+ To have them run by themselves, every weekday morning say, see [Running StickyInc on a schedule](./docs/routines.md): recipes for Claude Desktop, launchd and cron.
183
+
184
+ ### Routines
185
+
186
+ Save your own prompts as routines: ask Claude something like *"save a routine called waiting on others that asks what I'm waiting on from people, for Fridays at 3pm"*. Each routine appears next to the built-in prompts under its name, and can be exported as JSON to share (`sticky_routine_list` with `format: json`) and imported from someone else's (`sticky_routine_import`). Two examples to start from are in [`routines/`](./routines).
187
+
188
+ | Tool | What it does |
189
+ |---|---|
190
+ | `sticky_routine_list` | List your routines, or export them as JSON. |
191
+ | `sticky_routine_save` | Add a routine (a name, the prompt, and when it's meant to run), or replace one with the same name. |
192
+ | `sticky_routine_delete` | Delete a routine. |
193
+ | `sticky_routine_import` | Import routines from JSON; all or nothing. |
194
+
195
+ ### Where a task came from
196
+
197
+ Rest the pointer on a task in the pane to see where it came from: the words it came from, the app, and when, e.g. *"Remind me to call the dentist Friday afternoon…"* — Added from Claude Code · 2h ago. The tools that add tasks take an optional `context` with an `excerpt` (the user's words, kept to 200 characters) and a `ref` (a file, URL, or ticket), and the server records the app from the MCP handshake. Passive extraction stores the sentence it heard and a pointer to the transcript message. They're kept in `source_client`, `source_ref` and `source_excerpt`.
198
+
199
+ ### Due dates
200
+
201
+ The server works out due dates, not the model, so the same words at the same moment always give the same date. Claude passes along what you said (*"Friday 3pm"*, *"tomorrow"*, *"in 2 hours"*, *"next week"*) and StickyInc reads it with [chrono](https://github.com/wanasit/chrono), in your time zone.
202
+
203
+ - A day with no time means 9 am. "Today" after 9 am means the end of today.
204
+ - Relative words are read against when they were said: the moment of the tool call, or the message's timestamp for passive extraction.
205
+ - Your words are stored in `due_phrase` next to `due_at`, and the task's create event records the moment they were read against, so any date can be traced back to what was said.
206
+
207
+ `add_task` rejects words it can't read (*"EOD"*, *"the 5th"*) so Claude can rephrase; `add_task_natural` and passive extraction keep the task without a due date.
208
+
209
+ ### Keeping tasks somewhere else
210
+
211
+ The MCP server writes to `~/.stickyinc/tasks.db` unless `STICKYINC_DB` points elsewhere. The pane only reads the default, so use this for a list you don't want on the strip:
212
+
213
+ ```bash
214
+ claude mcp add -s user stickyinc -e STICKYINC_DB=~/work-tasks.db -- npx -y stickyinc
215
+ ```
216
+
161
217
  ---
162
218
 
163
219
  ## LLM providers
@@ -259,6 +315,21 @@ StickyInc intentionally doesn't ship its own Google OAuth flow. It's the single
259
315
 
260
316
  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
317
 
318
+ ### Stack pages from your browser
319
+
320
+ Right-click any page, link or selection → **Stack on StickyInc** → Read, Reply, Review or Decide. The page becomes a task about what you owe it (*Reply to “Q3 budget thread”*) with its address and your selection as where it came from, so due dates, reminders, search and "you clipped this to reply to last Tuesday" all work. Reply is due tomorrow at 9am; the rest have no date. Clips sit in a stack at the top of the pane: hover to fan it out, click a page to open it, tick it when it's done. Chrome and Edge for now; see [extension/README.md](./extension/README.md) to install it and pair it with the app.
321
+
322
+ ### Apple Reminders (macOS)
323
+
324
+ Turn it on from the pane's gear → Settings → Apple Reminders. Your open tasks then go to a **StickyInc** list in Reminders, which iCloud puts on your iPhone and Watch: updated when a task's text or due time changes, and ticked when you finish it. It's one way for now, so changes made in Reminders stay there. macOS asks once for permission to control Reminders; if you said no, allow StickyInc in System Settings → Privacy & Security → Automation.
325
+
326
+ ### Your dated tasks in any calendar (.ics)
327
+
328
+ While the pane runs, it keeps `~/.stickyinc/stickyinc.ics` up to date: every open task with a due date is a 30-minute event at its due time, with the words it came from in the notes. Finished tasks drop out. Each event's UID is its task's, so a calendar that refreshes the file updates events instead of adding copies. (Tasks added while the pane is closed appear the next time it opens.)
329
+
330
+ - **Apple Calendar:** File → New Calendar Subscription…, then paste the file's address: `file:///Users/<you>/.stickyinc/stickyinc.ics`. The pane's gear → Settings → Calendar → **Copy address** gives you yours. Pick an auto-refresh interval and your tasks stay in step.
331
+ - **Google Calendar, Outlook and others** can't read a file on your computer, so import it instead (Google: Settings → Import & export). That's a one-time copy; import again to pick up changes.
332
+
262
333
  ---
263
334
 
264
335
  ## Design axioms