@squirreljetpack/im-dynamic 0.2.11 β†’ 0.3.1

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/CHANGELOG.md CHANGED
@@ -1,275 +1,23 @@
1
- ## [0.2.11] - 2026-11-02
2
-
3
- ### πŸš€ Features
4
-
5
- - `im :c mm` opens the matchmaker render config (`mm.toml`) in
6
- `$VISUAL`/`$EDITOR`, alongside the config, `moods` and `colors` targets.
7
- - Log entries (moods, trackers, todo completions) store the UTC offset and
8
- the location string (the system IANA name, or empty when it has none) in
9
- effect where they were written. The today view groups log entities by their
10
- recorded **civil day** and renders their recorded civil time; ordering stays
11
- absolute. Mood/tracker previews show the differing location and wall-clock
12
- shift under the timestamp; task previews append the same parts inline to
13
- `last:` as `prev:`.
14
- - Tracker interval anchors are unzoned civil datetimes resolved in the current
15
- local zone. Replace-mode slots and cumulative sums assign foreign logs by
16
- their recorded wall clock, so an entry stays in the same civil slot when
17
- viewed from another zone.
18
- - Replace-mode null trackers store their absolute seconds from the interval
19
- start in the entry payload; color and the strict when-zone use that stored
20
- position.
21
- - Explicit todo completions join the today view on their civil completion day.
22
- `B` now merges explicitly completed scheduled tasks on that day instead of on
23
- an overlapping availability window.
24
-
25
- ### πŸ’₯ Breaking changes
26
-
27
- - Sync vocabulary is version 4: `tz_offset` (required int) and `location`
28
- (required text; empty when the system has no name) on mood, tracker and
29
- completion. Pre-v4 creates lack the
30
- location or offset and are intentionally unbuildable; reset the sync log
31
- when replaying one.
32
- - Databases from earlier builds are not migrated. Delete the database file and
33
- sign in to rebuild from the log. Tracker configs must drop the `Z`/numeric
34
- offset from interval anchors.
35
-
36
- ## [0.2.10] - 2026-10-31
37
-
38
- ### πŸš€ Features
39
-
40
- - `im :sync --reset` asks before it discards local changes the server never
41
- received; `--force` skips the question, and an idle database rebuilds without
42
- a prompt.
43
- - Sync is versioned end to end. A cursor names the log it indexes, and the
44
- client and worker exchange the envelope `protocol` and cell `version` on
45
- every round: a cursor minted by another log, one past the end of this log, or
46
- a peer that speaks another version is refused instead of merging unrelated
47
- histories or skipping what it cannot read. `im :sync status` prints the log,
48
- cursor version and both protocol numbers.
49
-
50
- ### πŸ› Bug Fixes
51
-
52
- - A task's start time is required, and an edit can no longer clear the column
53
- that defines a task's kind. A scheduled task's window opens at that start, a
54
- recurring task's intervals tile from it, and a oneshot is stamped with it at
55
- creation; clearing the duration or interval that goes with it is refused
56
- instead of silently reclassifying the task (and with it its availability,
57
- view membership and completion scope).
58
- - An end time is cleared by a blank answer (or `never`/`none`) in both the
59
- create and edit menus; a blank previously kept the old value.
60
-
61
- ### πŸ’₯ Breaking changes
62
-
63
- - A task create must carry `start_time`, so the cell vocabulary is now version
64
- 2. A peer that speaks another version refuses the round rather than skip the
65
- cell, and v0.2.9 and earlier clients send no version at all: redeploy the
66
- worker and upgrade the client together.
67
- - Databases from earlier builds are not migrated: a schema change means
68
- deleting the database file, then signing in to rebuild from the log.
69
-
70
-
71
- ## [0.2.9] - 2026-10-30
72
-
73
- ### πŸš€ Features
74
-
75
- - The recurring creation menu can edit start time, interval, and available
76
- duration, and the scheduled menu start time and available duration, so a
77
- value typed on the way in is corrected without cancelling. A duration at or
78
- beyond the interval means unbounded availability (`always`) instead of a
79
- validation error, editing the interval re-clamps the duration, and a blank
80
- answer keeps a scheduled task's current duration.
81
-
82
- ### πŸ› Bug Fixes
83
-
84
- - Today view: completed-on rows merge per interval instead of per task, so a
85
- completion logged in an interval without an availability window β€” before a
86
- moved-forward `start_time`, say β€” is no longer dropped when the task also
87
- has window rows. Each row's sum, `last:` and time label are scoped to its
88
- own interval.
89
-
90
- ### πŸ’₯ Breaking changes
91
-
92
- - Utility commands moved under `:tool` (`:tool config|embed|mood|clear`) and
93
- account commands under `:sync` (`:sync register|login|status|logout`).
94
-
95
-
96
- ## [0.2.8] - 2026-10-30
97
-
98
- ### πŸ› Bug Fixes
99
-
100
- - *(macos)* Link compiler-rt explicitly under fat LTO, fixing a startup
101
- segfault in ONNX Runtime environment creation (`im :embed`, `im :color`).
102
-
103
- ## [0.2.7] - 2026-10-30
104
-
105
- ### πŸš€ Features
106
-
107
- - `im :color` without a mood lists every anchor mood of the moods file with
108
- a swatch of its color, one per line; `im :color <mood>` keeps the full
109
- pipeline diagnostic.
110
- - Today view: `[today_view] swap_all_and_due_recurring_task_views` trades the
111
- `All` and `Due` recurring-task displays. `Due` is anchored at now (earliest
112
- window intersecting the horizon, skipping closed windows), and previews are
113
- scoped to the row's window instead of sharing the whole day.
114
- - No phantom availability windows past a recurring task's expiry, and
115
- today-view `ends` shows the task's real expiry again.
116
-
117
- ### πŸ› Bug Fixes
118
-
119
- - *(embedding)* Pin the CPU EP on macOS
120
-
121
- ## [0.2.6] - 2026-10-29
122
-
123
- ### πŸš€ Features (sync)
124
-
125
- - `im :auth register|login|status|logout` and `im :sync` (plus
126
- `im :sync --reset`) sync a database against a Cloudflare Worker
127
- (`sync-server/`): a per-user Durable Object holds the log, D1 the accounts.
128
- - Concurrent edits merge per field (last write wins) instead of per entity; a
129
- push breaks at entity boundaries, so a create carries all of its cells.
130
- - Deletes are terminal and slot losers become tombstones, so two devices that
131
- edit the same field converge instead of duplicating rows.
132
- - Entity ids are UUIDv7, so a row created on any device is unique without a
133
- round trip; local `short_id`s stay a per-device projection.
134
- - The server address comes from `[sync] server` in the client config
135
- (`IM_SYNC_URL` overrides it for one command); the account is stored apart
136
- from the sync state, so `im :sync --reset` does not sign you out.
137
- - A database from an older version (INTEGER keys) is copied aside and
138
- recreated empty instead of being written with the wrong key type; an
139
- unreadable file is quarantined the same way.
140
-
141
- ### πŸ’₯ Breaking changes (tracker rework)
142
-
143
- - `min`/`max` renamed to `low`/`high`; `kind = "number"` renamed to
144
- `"integer"`; new `kind = "duration"` (duration-string values stored as
145
- seconds, displayed like `6m 30s`).
146
- - `interval` now takes a table `{ anchor, span, cumulative = false }`
147
- - Value and bound forms are strict per kind/mode: `float` takes plain
148
- numbers, `integer` plain whole numbers, `duration` duration strings only,
149
- `null` no value at all; `low`/`high` mirror the value form of the kind
150
- (duration strings for `duration` and `null`+replace, whole numbers for
151
- `text` and `null`+cumulative). Invalid bound forms are dropped with a
152
- warning at config load.
153
- - New `strict` setting gates logging/updating: numeric kinds gate the value
154
- against the inclusive `low`..`high` span (inverted bounds gate the span
155
- between them), `text` gates the message length in characters, `null`
156
- trackers gate *when* they may be logged (the circular `low`/`high` time
157
- offset zone; requires both bounds, replace mode only).
158
- - `null` trackers require an interval (dropped with a warning otherwise) and
159
- store score 0 in every mode β€” the payload column is unused and today-view
160
- rows show no payload (the count lives in the grid, the timestamp in the
161
- entry's own time). Negative durations are rejected at log time.
162
- - Replace-mode insertion is one shared strategy for all kinds: a CLI log in
163
- an occupied slot drops the slot's previous rows (including rows logged
164
- with a mood β€” the mood row itself survives) and inserts the new one.
165
- - The TUI update action on a `null` row only moves its timestamp to now,
166
- within its current interval slot (cross-slot moves are rejected, the
167
- strict zone still applies); on value-bearing kinds it runs the same strict
168
- pipeline as the CLI.
169
- - `:db doctor` prunes any nonzero row of a `null` tracker (all modes).
170
-
171
- ## [0.2.5] - 2026-08-14
172
-
173
- ### πŸš€ Features
174
-
175
- - Editor no longer opens automatically for interactive flows.
176
- - Config adjustments
177
- - Body templates
178
- - Adjust today view filters
179
- - Config.tasks.overdue_color + badge::task_label_color
180
- - Today-view preview polish + overdue date column + task children
181
- - Link actions in the today view (Ctrl+L)
182
- - Improve jiff-english robustness
183
- - TUI migration to matchmaker
184
-
185
- ## [0.2.4] - 2026-08-07
186
-
187
- ### πŸš€ Features
188
-
189
- - Db :doctor
190
- - Jiff-english
191
- - Duration trackers
192
- - Tui interaction for trackers
193
-
194
- ## [Unreleased]
195
-
196
- ### πŸš€ Features
197
-
198
- - `[badges]` config section: journal badge (glyph and/or color β€” a bare
199
- char, a color string, or `{ badge = 'Β·', color = "red" }`; color defaults
200
- to `Reset`), plus `tracker` and `mood` glyph overrides for the today
201
- view and previews. `journal_badge` moved from `[today_view]`.
202
- - Today view task filter: `TasksFilter` (`none` / `all` / `overdue` /
203
- `pending` / `horizon`) replaces `config.today_view.include_overdue` as
204
- `initial_tasks_filter`, bound to the view variant β€” `All` uses the
205
- configured filter, `A` pins `Horizon`, `B` pins `Overdue`; `none` hides
206
- the whole task section (journal-only view). Undated
207
- oneshots created before today are no longer dropped from the `All`
208
- variant. `CycleShow` renamed `CycleFilter`; TUI headers label the
209
- variants per app (`all | journal | tasks` in the today view,
210
- `all | oneshot | other` in the tasks view).
211
-
212
- - Renamed: the binary is now `im` (previously `feeling`), and the logged
213
- mood entries are consistently called moods β€” DB schema (`mood` table,
214
- `tracker.mood`, `task_moods.mood_id`), code identifiers, CLI usage
215
- strings, and docs. Data paths moved to `~/.config/im` / `im.db`;
216
- existing `feeling` databases and config dirs are not migrated and must
217
- be moved/deleted by hand.
218
- - Task↔mood links: `im <mood> -<short id>` records a link; the task
219
- preview shows a `moods:` field with colored badges
220
- - `:db` command replaces `:prune` β€” `:db prune` (old behavior) and
221
- `:db backfill` (persist missing mood embeddings/scores)
222
- - `:db doctor` β€” checks tracker entries against their configured kinds and
223
- prunes entries whose storage class no longer matches (orphaned tracker
224
- types and stale nonzero time-marker entries included), after an
225
- interactive confirm
226
- - Tracker intervals are calendar-aware (`interval = ["2020-01-01 00:00", "1 day"]`)
227
- - New `null` tracker kind: valueless timestamp markers with time-of-day
228
- coloring (e.g. sleep start) or per-interval counting
229
-
230
- ### πŸ› Bug Fixes
231
-
232
- - Recurring-task and tracker intervals are calendar-based (jiff): DST and
233
- variable month lengths no longer drift interval boundaries
234
- - Interval storage switched from seconds to packed jiff spans
235
-
236
- ## [0.2.3] - 2026-08-07
237
-
238
- ### πŸ› Bug Fixes
239
-
240
- - Reorganize parse, fix overflow
241
-
242
- ## [0.2.2] - 2026-08-07
243
-
244
- ### πŸš€ Features
245
-
246
- - Show name of attached parent during interactive task creation
247
-
248
- ## [0.2.1] - 2026-08-06
249
-
250
- - Release pipeline updates
251
- - misc
252
-
253
- ## [0.2.0] - 2026-08-06
254
-
255
- ### πŸš€ Features
256
-
257
- - Nomic embedder, ort runtime
258
- - Reorganize views
259
- - Reorganize config
260
-
261
- ### πŸ’Ό Other
262
-
263
- - CliOpts flag counts threaded into handlers
264
- - ColorAxesSettings flattened into MoodConfig; :color verbose axes dump
265
- - Scheduled task syntax β€” ':' description, '@' duration markers
266
- - Lock invalid-timestamp behavior with regression tests
267
- - Task creation confirmation polish
268
- - Cliclack intro for task flows; prefill fields logged
269
- - 'feeling @<date>' β€” today view anchored to arbitrary days
270
- - Grid titles + verbose gating; text-tracker entry timestamps
271
- - Shared Enter-action across both TUIs
272
-
273
- ## [0.1.0] - 2026-08-01
274
-
275
- Initial commit
1
+ ## [0.3.1] - 2026-11-07
2
+
3
+ ### πŸš€ Features
4
+
5
+ - `im -V` / `im --version` prints the version.
6
+ - Task creation uses `+`: `im +`, `im + <name>`, `im +<ref> <name>`,
7
+ `im + %`, and `im + @`; recurring names require the `:<name>` marker.
8
+ - Trackers, at most one task reference, and task updates can be freely mixed
9
+ in one entry, and `--quiet` works as a long flag.
10
+ - Sessions show a countdown chosen by `[session] countdown` (`timer`, `bar`,
11
+ `dots`, `percent`, `minimal`); `bar` is the default.
12
+ - Text trackers take a configurable badge color
13
+ (`badges.default_text_tracker_color`, `dark_grey` by default) instead of
14
+ inheriting the darkest bin of the default ramp.
15
+ - New `notify` crate and CLI: cross-platform toasts and dialogs with bundled
16
+ `bell`, `bowl` and `chime` sounds played through rodio.
17
+ - `im :tool datetime [expr]` resolves a date expression and prints it in a
18
+ chosen format. `--format` accepts presets (`civil`, `utc`, `short`, `unix`,
19
+ `iso`, `date`, `time`, `dmy`, `mdy`), a time zone (IANA name, unique case-insensitive
20
+ fragment, or fixed offset such as `+08:00`), or a custom `strftime`
21
+ pattern. A resolved zone reports its name and offset on stderr unless
22
+ quiet.
23
+ - Bundled mood palette variants: earth, nordic, jewel, bloom, and pastel.
package/README.md CHANGED
@@ -2,52 +2,118 @@
2
2
 
3
3
  `im` is a CLI tool for recording all the small moments, feelings, thoughts and setbacks and accomplishments that make up your day[^1].
4
4
 
5
- ```shell
6
- # record moods and notes
7
- im playing chess against stockfish and im winning # mood
8
- im confused . why did i lose? # mood + note
9
- im . turns out i was playing antichess # note
10
-
11
- im worried about school tomorrow
12
- im sad that my dog ate my bones
13
- im sorry that my cat ate my dog
14
-
15
- im abe on the next level
16
- im abe rockin over that base treble
17
- im aswing it this way
18
- im aswing it that-a-way
19
-
20
- # a trailing . opens your editor for writing the note
21
- im terrified that someone will see me writing this down .
22
-
23
- # add a task
24
-
25
- # build habits with recurring tasks
26
-
27
- # schedule future events
28
-
29
- # show today's agenda
30
- im @due | cat
31
-
32
- # log custom trackers
33
- im full -food 7
34
- im going to bed -sleep -acc finished blog post
35
- im still up -sleep
36
- im still up -sleep
37
-
38
- # visualize your progress
39
- im :
40
-
41
- im :month pet_cat cat_food_spend wins
5
+ ```console
6
+ # --- record moods and notes ---
7
+
8
+ > im worried about school tomorrow # mood
9
+ > im sad . that my dog ate my bones # mood with note
10
+ > im . and my cat just ate my dog # journal entry (pure note)
11
+
12
+ # --- create tasks ---
13
+
14
+ > im + # create a task (interactive)
15
+ β”Œ Create oneshot task
16
+ β”‚
17
+ β—‡ Task name:
18
+ β”‚ recover bones
19
+ β”‚
20
+ β—‡ Edit fields:
21
+ β”‚ Times to complete
22
+ β”‚
23
+ β—‡ Times to complete:
24
+ β”‚ 10
25
+ β”‚
26
+ β—‡ Edit fields:
27
+ β”‚ Finish
28
+ β”‚
29
+ β”” Created task #1: recover bones
30
+
31
+ > im +bones defeat cat @tomorrow noon # create a subtask (under the last task)
32
+
33
+ # --- log habits, events and trends ---
34
+
35
+ > im going to bed first # (think before you act)
36
+ > im -sleep # log sleep time
37
+ > im -sleep . still up # update logged time
38
+ > im a boneless sleepless wretch . \ # (keep up with mental health by
39
+ > im not ready for tomorrow # being honest with your feelings)
40
+ > im -sheep 1 # log a sheep
41
+ > im -sheep 1 # log another sheep
42
+ > im -sheep 1 # continue to log sheep
43
+ > im -sheep 1 # btw: this is a different tracker than the
44
+ > # first, it accumulates entries in an interval.
45
+ > # There 5 types in all. Additionally, specifying whether a tracker has an interval, has bounds, is strict, or is cumulative also changes its behavior. The first tracker can be found in the default configuration file, defined as a null tracker with a bounded interval, while the second can be assumed to be a standard integer tracker.
46
+ > im -sleep .. zzZzz
47
+
48
+ # --- check agendas & complete tasks ---
49
+
50
+ > im ready for a new day!
51
+ > im @due | cat # give the cat its due (displays tasks due today)
52
+ 23:59 β—‹ defeat cat
53
+
54
+ > im alive but in pain +cat # log mood + complete task
55
+ > im become +bones .. destroyer of cat # update task
56
+ > im +bones 9 # collect bones (complete task)
57
+
58
+ > im happy I found all of my bones :)
59
+ bash: syntax error near unexpected token `)'
60
+
61
+ > im . # write note in $EDITOR (a trailing . opens it)
62
+ ---
63
+ happy i found all of my bones
64
+ 10 on my fingers and 10 on my toes :)
65
+ ---
66
+
67
+ > im ... # (the No. of dots can be used to select from configured templates)
68
+ ---
69
+ %% Template #3 %%
70
+ that's all of them right?
71
+ ---
72
+
73
+ > im -thought oh no . # text tracker entry
74
+ ---
75
+ I got Reese's Puffs in my bowl,
76
+ Now my days on cruise control,
77
+ I got Reese's Puffs in my bowl
78
+ and just like that Im on a roll,
79
+ [REDACTED],[REDACTED],[REDACTED],[REDACTED]
80
+ ---
81
+
82
+ # --- set goals ---
83
+
84
+ > im + %1 day :regrow bones =1 # Create a recurring task with a (exceedable) target
85
+ > im @186 days from now :return to school # Schedule future events
86
+ > im + shop: bone meal, bonebons, Skele-Gro, 99% milk # Shopping list
87
+
88
+ > im # Check today's journal
89
+ [UNDER CONSTRUCTION]
90
+
91
+ # --- visualize your success with a grid ---
92
+
93
+ > im : # (the dots are colored according to the aggregate mood of your entries from that day)
94
+ β—― ● ● β—― ● ●
95
+
96
+ > im :month bones # recurring task progress can also be graphed
97
+ ● ● ● ● β—― ● ●
98
+ ● ● β—― ● β—― β—― ●
99
+ ● ● ● ● ● ● ●
100
+ ● ● β—― ● ● ●
101
+
102
+ > im :month cats_defeated # (5 cats were harmed in the making of this transcript)
103
+ β—― β—― β—― β—― ● β—― β—―
104
+ β—― β—― ● β—― ● ● β—―
105
+ β—― β—― β—― β—― β—― β—― β—―
106
+ β—― β—― ● β—― β—― β—―
42
107
 
43
108
  # reflect and repeat
44
- im still alive . i think
109
+
110
+ im still alive . im glad
45
111
  ```
46
112
 
47
113
  ## Features
48
114
 
49
115
  - Log moods and journal entries in simple, natural syntax.
50
- - Today view: show a ordered summary of all that you have logged and planned today -- an interactive, auto-generated daily note.
116
+ - Today view: show a ordered summary of all that you have logged and planned today -- an interactive, auto-collated daily note.
51
117
  - Grid view: Display your mood, task and tracker histories as dots.
52
118
  - Moods are colored by how much they match to various emotions or topics you have configured.
53
119
  - Change the topics, timespans, and filters, and watch as interesting patterns emerge.
@@ -58,10 +124,9 @@ im still alive . i think
58
124
 
59
125
  ## Gallery
60
126
 
61
- ![image-20260814134534039](.README.assets/image-20260814134534039.png)
62
-
127
+ ![08-grid-view-mood](.README.assets/08-grid-view-mood.png)
63
128
 
64
- <img src="https://raw.githubusercontent.com/Squirreljetpack/im/main/.README.assets/image-20260814134849943.png" alt="month" style="width:200px;"/>
129
+ ![today-view-tui-v1](.README.assets/today-view-tui-v1.png)
65
130
 
66
131
  ## Usage
67
132
 
@@ -71,41 +136,44 @@ im β€” immediate mood, journal, and task tracker
71
136
 
72
137
  Usage:
73
138
  im <mood> [. [body]] log a mood (with an optional body)
74
- im %<duration> start a timed session
75
- im [-<tracker> [value]]... [mood] add one or more custom tracker records
76
- (optionally attached to a mood)
77
-
78
- im ! [name] [@<time>] create a task (interactive without a name)
79
- im ! %[interval] [[:]name] create a recurring task (interactive)
80
- im ! @[time] [:<name>] [%<duration>] scheduled a task (interactive if partial)
139
+ im [-<tracker> [value]].. add one or more custom tracker records
140
+ im <mood> [+task] [-trackers..] log a mood linked with an existing task
141
+ or new tracker records
142
+ im %<duration> [purpose..] start a timed session
143
+ (trackers, task & body supported)
144
+
145
+ im + create a task
146
+ im +[parent] <name> [@<time>] create a task (non-interactive)
147
+ im + %[interval] [:<name>] create a recurring task (interactive)
148
+ im + @[time] [:<name>] [%<duration>] schedule a task (interactive if partial)
81
149
  im +[task] [count] edit or update a task by its reference
82
- (see `im -vh`)
150
+ (see `im -vh` for reference)
83
151
 
84
152
  Views:
85
153
  im @[date] today view
86
154
  im @due[:t|:w] due view
87
155
  (today / tomorrow / this week)
88
156
  im @[:o|:O] pending tasks
157
+ (all / oneshot / recurring&scheduled)
89
158
  im @done[:o|:O] completed tasks
90
- (all / oneshot / recurring+scheduled)
159
+ (all / oneshot / recurring&scheduled)
91
160
 
92
161
  Trackers and grids:
162
+ im - browse trackers
93
163
  im :[week|month|year] [ids] dot-sequence tracker grid
94
164
  ids: <tracker> or @<recurring name>
95
165
  period defaults to "week"
96
166
 
97
167
  Other:
98
- im :tool embed|mood|clear|.. (see `im :tool --help`)
99
- im :tool config | :c [moods|colors|mm] open the config in $VISUAL / $EDITOR
100
- im - browse trackers
101
- im :db prune|backfill|doctor database utilities
102
-
168
+ im :c [moods|colors|mm] open the config in $VISUAL / $EDITOR
169
+ im :tool db|mood|clear|.. (see `im :tool --help`)
103
170
  im :sync [register|login|status|logout] setup/authenticate/run sync
104
171
 
105
172
 
106
173
  Flags:
107
174
  im -q | -v <command> quiet / verbose; flags go first
108
175
  im --help | -h show this help (-v applies)
176
+ im --version | -V show version
109
177
  ```
110
178
  <!-- HELP_END -->
111
179
 
@@ -143,6 +211,18 @@ The default locations are in order:
143
211
  - tasks: oneshot, recurring, or scheduled.
144
212
  - trackers: defined in your configuration.
145
213
 
214
+
215
+
216
+ ##### Moods
217
+
218
+ The most basic use of `im` for a kind of offhand journaling where you logging any moods that come to you throughout the day, such as `im happy` or `im cold`, or thoughts such as `im . maybe i should put on some pants`. They are collected in the [Today view](#views) together with other task and tracker entries from the day, and im collates them into a interactive daily journal.
219
+
220
+ Also, every mood is assigned a color, by determining its weighted semantic alignment to a set of configured _mood anchors_ (color, mood pairs), yielding pretty, meaningful dots on the interface and in the grid view[^4] that provide users with a sense of pride and accomplishment.
221
+
222
+ Finally, `im %<duration>` starts a Pomodoro session -- idk why. Personally, I find the Pomodoro method a depressing concept. Anyways, start a session, link it to a tracker or task if you want, and when time is up it will prompt you about how it went; don't answer if you don't feel like it. If you just want to create timed notifications, that's available through `im :tool notify`.
223
+
224
+ [^4]: `im :[week|month|year]`
225
+
146
226
  ##### Trackers
147
227
 
148
228
  Trackers are defined in your configuration (`im :tool config`); each `[tracker.<name>]`
@@ -150,19 +230,55 @@ section is logged through `im -<name> <value>` (no value for `null` trackers):
150
230
 
151
231
  - Kinds: `text`, `integer`, `float`, `duration` (strings like `6m 30s`), `null` (timestamp/count markers β€” requires an interval).
152
232
  - `interval = { anchor = "2026-01-01T00:00:00", span = "1 day" }` bins
153
- entries into calendar slots. The anchor is an unzoned civil datetime (no `Z`
154
- or numeric offset) resolved in your current local zone. By default, a new log
155
- in a slot replaces the slot's previous entry; `interval.cumulative = true`
156
- keeps every log and the slot's grid dot shows the aggregate. Logs record the
157
- UTC offset and location string (the system IANA name, or empty) they were
158
- written in, so they stay on their recorded civil day and interval slot when
159
- viewed from another zone.
233
+ entries into calendar slots. The anchor is an unzoned civil datetime resolved
234
+ in your current local zone. By default, a new log in a slot replaces the slot's previous entry;
235
+ `interval.cumulative = true` keeps every log and the slot's grid dot shows the aggregate.
236
+ Logs record the UTC offset and location string they were written in, so that although tracker intervals shift with your zone's offset (keeping the civil time of their availability fixed), logs stay in the same interval slot.
237
+
238
+
239
+
240
+ ##### Tasks
241
+
242
+ The three types of tasks share an underlying data-type, distinguished only by the presence of specific fields. _Recurring_ tasks have an interval, _scheduled_ tasks have a duration but no interval, and _oneshot_ tasks have neither.
243
+
244
+ - The interval of recurrence is a calendar-aware span (i.e. 1 day or 1 week) anchored at an absolute `start_time` [^3].
245
+ - Scheduled tasks are surfaced on such views as the Today or Due views when they are upcoming, and are completed automatically once their availability window passes. They can also be completed or cancelled early.
246
+ - Oneshot tasks and recurring tasks can both specify a (exceedable) target count.
247
+ - Tasks carry fields such as priority, parent tasks, due dates (for oneshot tasks), & task body etc. They can be specified (or edited) at creation or afterwards, through an interactive menu-style CLI prompt flow.
248
+
249
+
250
+
251
+ ##### Views
252
+
253
+ The app includes 3 [TUI](https://en.wikipedia.org/wiki/Text-based_user_interface)s:
254
+
255
+ - The _Today view_ (`im`), which aggregates tasks, trackers and mood/journal entries to provide a itinery + recap of the current horizon (Today, Today + Tomorrow, This Week) -- a kind of live journal. It can be filtered to just events or upcoming due tasks.
256
+ - The _Tasks view_ (`im @`), which lists *(drum roll)* all the tasks. It can be filtered to just oneshots, or just recurring/scheduled, or to future/past/completed/incomplete etc.
257
+ - The _Tracker view_ (`im -`), from where you can select a tracker type and log an entry for it.
258
+
259
+ For a comprehensive SPEC of the rules which determine which entities make it into a specific view, see the [docs](./docs/VIEWS.md).
260
+
261
+
262
+
263
+ ##### Sync
264
+
265
+ `im` stores your data in a local sqlite db. But it also supports cross-device sync by way of a central server that maintains an event log. Updates are per-field conflicts are resolved via LWW, meaning if two edits are made on the same field and afterwards synced, the one whose recorded time *as measured on-device* is later is agreed upon as the field's value. Such conflicts are surfaced in the output when running `im: sync` but *never prompt and thus erase data*. The one exception is *deletes*: deletes are final, meaning that *any* edit to a field made after a deletion of the source has been recorded in the log is ignored. For this reason, when a client contains a field update which would be dropped by pulling this event, they are prompted with the option to *resurrect* the entity as it currently exists in their local database as a safeguard.
266
+
267
+ To enable syncing, run `im :sync register` on Device A, `im :sync login` on Device B, then `im :sync` on one or both devices. Syncing does not run automatically.
268
+
269
+
160
270
 
161
271
  ## FAQ
162
272
 
163
273
  ### Why is the binary size so large?
164
274
 
165
- `im` bundles a quant of `nomic-ai/nomic-embed-text-v1.5` to categorize your entries. This was the most effective, reasonably sized approach tested out of several options. The size is a bit abnormal, but was pleasantly surprised with how much better it worked compared to my other attempts. If you have any interesting uses for an embedding model that `im` can help with, `im` open to them!
275
+ `im` bundles a quant of `nomic-ai/nomic-embed-text-v1.5` to categorize your entries. This was the most effective, reasonably sized approach tested out of several options. The size is a bit abnormal, but was pleasantly surprised with how much better it worked compared to my other attempts.
276
+
277
+ If you are particularly idle, it can be a source of amusement or annoyance depending on your temperament. For example, `im :tool mood` scores `im a consummate wretch` with: `humble: 0.6668, vengeful: 0.2732, disgusted: 0.0281, smitten: 0.0175, frustrated: 0.0144`, while `im a little teapot` gets: `regression weights (rescaled) : hungry: 0.5459, nostalgic: 0.2902, thoughtful: 0.0736, smitten: 0.0490, purposeful: 0.0412`. So yeah, the tiny LM has some pretty good intuition into emotional psychology I'd say (also, the saliency scores are `0.9946` vs `0.0079` so it's wise to that trick too).
278
+
279
+
280
+
281
+ If you have any interesting uses for an embedding model that `im` can help with, `im` open to them!
166
282
 
167
283
  ### What does im stand for?
168
284
 
@@ -171,6 +287,10 @@ What it stands for is immaterial[^2].
171
287
  ### How can I contribute?
172
288
  Open to suggestions. Helping implement more filters, or a sensible configurable spec for exporting to markdown would be helpful. Documentation, always.
173
289
 
290
+
291
+
292
+
293
+
174
294
  ## See also
175
295
 
176
296
  - https://github.com/qiz-li/im
@@ -184,4 +304,5 @@ Open to suggestions. Helping implement more filters, or a sensible configurable
184
304
  - rationalize bad decisions
185
305
  - realize that you don't actually have any thoughts interesting enough to write down.
186
306
 
187
- [^2]: important, immense, immaculate, importune, imagine all the people .. immolatedβ™«
307
+ [^2]: important, immense, immaculate, importune, imagine all the people .. immolatedβ™«
308
+ [^3]: This differs from trackers, whose intervals shift to follow your timezone offset: while recurring tasks with intervals in the units of days will be robust to DST, changing time-zones will likely cause their availability windows to shift in time of day.
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "hasInstallScript": true,
20
20
  "name": "@squirreljetpack/im-dynamic",
21
- "version": "0.2.11"
21
+ "version": "0.3.1"
22
22
  },
23
23
  "node_modules/detect-libc": {
24
24
  "engines": {
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "requires": true,
50
- "version": "0.2.11"
50
+ "version": "0.3.1"
51
51
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/Squirreljetpack/im/releases/download/v0.2.11"
3
+ "https://github.com/Squirreljetpack/im/releases/download/v0.3.1"
4
4
  ],
5
5
  "bin": {
6
6
  "im-dynamic": "run-im-dynamic.js"
@@ -87,7 +87,7 @@
87
87
  "zipExt": ".tar.xz"
88
88
  }
89
89
  },
90
- "version": "0.2.11",
90
+ "version": "0.3.1",
91
91
  "volta": {
92
92
  "node": "18.14.1",
93
93
  "npm": "9.5.0"