gitroll 0.2.0 → 0.3.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/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to GitRoll are documented here. GitRoll follows [semantic versioning](https://semver.org). The Roll file format has its own version, documented in [SPEC.md](SPEC.md).
4
4
 
5
+ ## 0.3.0 (2026-09-16)
6
+
7
+ - **Search says what it looks at.** Somebody will eventually search for a word that is inside a receipt and expect a match, so the terminal app, the browser app, `gitroll help more` and the README now say the same thing: search reads what you wrote — an event's words, title, topics, tags, amount, front matter and the names of its attached files — and not what is inside those files, not other Rolls (unless `find --all`), not deleted events and not older versions. A search that finds nothing says it there and then.
8
+
9
+ ### Changed
10
+ - **The format is much simpler, and this is a breaking change.** An event is now an ordinary Markdown file under `.gitroll/events/`, named for its date and what happened (`2026-09-15-ac-serviced.md`). Front matter is optional: a heading and a paragraph is a complete event. Gone are year/month folders, UUID file names, required `version`, `id`, `created`, `author` and `occurred` fields, hash-named attachments and attachment manifests, project definition files, and custom event types. Files kept with an event are ordinary files in `.gitroll/files/`, linked with ordinary relative Markdown links. GitRoll launched today with no users, so nothing is migrated.
11
+ - **Everything GitRoll owns lives in `.gitroll/`** at the root of a Git repository. A log can be a repository of its own or sit beside a project you already have: adding one creates `.gitroll/` and nothing else, leaves your README and branch alone, and commits only the files GitRoll wrote. `.gitroll/` is a namespace, not a privacy boundary — a log in a public repository is public.
12
+ - **An event's identity is its path**, so `git mv` is a rename and Git history follows it. `gitroll move` renames an event and rewrites its links. Authors come from Git history instead of a field in the file.
13
+ - **Dates come from the file name** unless the front matter says otherwise, and an event with neither is shown as undated rather than rejected. Date filters compare calendar days as written, so an event stays on its author's day everywhere.
14
+ - **Projects and tags need no setup.** Naming one on an event is all there is to it.
15
+ - **`.gitroll/config.yaml` records `template_version`.** GitRoll reads it, never changes it while logging or editing, refuses to write to a repository whose template is newer than the app, and reports a missing marker as an unknown version instead of assuming it is current (`gitroll template --set 1` records one).
16
+ - **Editing preserves what you wrote:** comments, key order and unknown front matter keys survive a save, and the body is left untouched unless the text itself changed.
17
+
18
+ ### Added
19
+ - **Imports from GitHub and CI.** `gitroll import github` logs merged pull requests and releases, `gitroll import ci` logs builds that failed (`--status all` for the rest), for this Roll's own repository or one you name. Filter with `--since`, `--until`, `--branch`, `--author`, `--label`, `--status` and `--limit`, and see what would happen with `--dry-run`. GitHub is asked through the GitHub CLI if it's signed in, then `GITHUB_TOKEN`, then not at all; no token is ever stored. JSON piped in from `gh api` or a webhook works too. Nothing is logged twice — `source: { adapter, id }` is the thing's own identity, a repeated import starts where the last one left off and says so, and an event you edited after importing stays as you left it. See [docs/IMPORT.md](docs/IMPORT.md).
20
+ - **Ask your Roll is a normal feature**, not an experiment behind an environment variable. `gitroll ai` lists where a model can run (on your computer first, so nothing leaves it), `gitroll ai test` says which thing is wrong when it doesn't work, and `gitroll ai on`/`off` switches it without forgetting the settings. The app has the same thing behind ✨ in the header, and tests what you typed before it saves. Keys are read from environment variables and never stored; a Roll's `ai: false` still turns Ask off for everyone. Answers cite events and link to them, and an answer can be turned into a draft event — which stays a draft until you save it. `gitroll summary` drafts an update from a date range the same way.
21
+ - **The Roll's branch is visible**: in the browser header, the terminal header and `gitroll status` (including `--json`, which also carries the head commit, the repository and why syncing is blocked). A detached HEAD and a repository with no commits are named rather than guessed at, and syncing on a detached HEAD stops and says what to do.
22
+ - **Code references.** `#412`, `owner/repo#412`, a commit SHA and GitHub URLs in an event's text become links when the event says which repository it is about. `gitroll log --code` records the repository, branch and commit you're on, as `source: { repo, branch, commit }`.
23
+ - **`gitroll log --editor`** (and `gitroll edit --editor`), using `$VISUAL` or `$EDITOR`, and **`gitroll completion bash|zsh|fish`** for commands, Rolls, templates, tags, projects and saved searches.
24
+ - **Templates** for the kinds of event developers write often — debugging, incident, deployment, experiment and architecture decision — in `gitroll log --template`, `gitroll templates`, and the app's composer.
25
+ - **`gitroll restore`**, and *Put this version back* in History: an earlier version returns as a new commit, so nothing is ever rewritten.
26
+ - **`gitroll conflicts` and `gitroll resolve`**, and a Conflicts screen in the app: an event changed in two places, side by side, settled by keeping one version or writing one out of both. Both stay in history.
27
+ - **Related events and backlinks** from ordinary Markdown links between events (`gitroll related`, and on every event in the app).
28
+ - **Saved searches** (`gitroll find … --save <name>`, then `find @name`, `gitroll searches`) and **`gitroll find --all`** across every Roll on this computer.
29
+ - **A workspace in the terminal.** `gitroll` now opens a persistent prompt with your recent entries above it. Type what happened and press Enter to log it; press `/` for a searchable command menu (`/log`, `/find`, `/topics`, `/roll`, `/sync`, `/status`, `/undo`, `/web`, `/help`) with descriptions and autocomplete.
30
+ - **A complete composer** (Ctrl+O or `/log`): text over several lines, date, amount, tags, topics and files, with topic and tag autocomplete, dragged or pasted file paths, and `Ctrl+E` to write in your own editor. Entries can be edited or duplicated from the composer too.
31
+ - **Unsaved drafts are kept.** Leaving the composer, switching Rolls or quitting keeps what you wrote, and GitRoll offers it again next time. Drafts live with your settings, never inside a Roll.
32
+ - **Interactive search** (`/find`): results as you type, arrow-key selection, a preview beside the list in a wide terminal, and edit, duplicate, delete or write a new entry without leaving it. Your query and selection are still there when you come back.
33
+ - **Undo deletion** with Ctrl+Z (or `/undo`), and the header now says which Roll you're in, where it lives, and whether it's saved only on this computer or backed up.
34
+ - **The Roll you switch to is remembered**, so it opens next time.
35
+ - **The workspace always says where it's writing:** the Roll, the branch and the folder, in the header. Saving names the file it wrote, and switching Rolls says which folder you landed in.
36
+ - **Saved, committed and backed up are three different things**, and the header keeps them apart: files changed in the folder but not committed are counted separately from changes committed here but not yet at your backup.
37
+ - **Git states that stop a sync explain themselves.** A detached HEAD, an unfinished merge or an unfinished rebase each say what still works (logging always does) and the command that clears it, instead of a branch name GitRoll guessed at. `gitroll status` reports the same.
38
+ - **Files GitRoll can't read are named, not dropped.** An entry whose front matter can't be parsed — a date typed by hand, say — used to disappear from the terminal app with no explanation. The workspace now says how many there are, and `/problems` lists each one with the part to fix and opens it in your editor. GitRoll never rewrites them: the writing stays exactly where its author left it.
39
+ - **The workspace picks up changes made anywhere else.** Editing a file in your editor, or logging from another window, updates the timeline by itself — never while you're in the middle of writing something.
40
+ - **An entry edited in your editor is never silently overwritten.** If the file changed on disk while the composer was open on it, saving stops and asks, instead of replacing their version with yours.
41
+
42
+ - **Deleted events have somewhere to go.** `/deleted` lists what has been deleted from this Roll, read back out of Git history, and puts any of it back with the text exactly as it was written. Restoring is a new change, so the history shows both the deletion and the recovery — nothing is rewritten.
43
+ - **An event's files can be opened from the terminal** with `o` (`Tab` picks another), in whatever application normally opens them. A file an event links to that isn't in the Roll — not synced yet, say — is marked rather than failing quietly.
44
+ - **What happens to attachments is said plainly:** files are copied into `.gitroll/files/` and linked from the event, so the originals can move or be deleted afterwards, and unlinking one leaves the copy alone because another event may link the same file.
45
+
46
+ ### Changed
47
+ - **Backing up happens when you ask, in every interface.** 0.2.0 gave the browser app an automatic backup shortly after each save and on returning to the window; the terminal app has always waited to be asked. Uploading a private logbook somewhere else is a decision rather than housekeeping, so now both wait. Nothing about the writing is at risk in the meantime: saving still commits to Git immediately, and the header says how far behind the backup is.
48
+
5
49
  ## 0.2.0 (2026-09-15)
6
50
 
7
51
  ### Changed
@@ -11,7 +55,7 @@ All notable changes to GitRoll are documented here. GitRoll follows [semantic ve
11
55
  - **Search is one query box.** Filters and typed words are the same string now, so they can't disagree. Suggestions appear as you type (`has:`, `topic:`, `type:`, `after:`, `amount:` and the values for each), and the whole thing works from the keyboard. The syntax is the same one `gitroll find` takes.
12
56
  - **Event text is rendered as Markdown**, which is what the format always said it was. Headings, lists, emphasis, quotes, code and tables all display, and photos and files can be embedded in the text itself. The editor has a toolbar, `Ctrl`/`⌘`+`B`/`I`/`K`, and a preview. What is written to disk is still plain Markdown a person can read.
13
57
  - **Backing up happens by itself**, shortly after you save and when you return to the window, and reports what it is actually doing (checking, downloading, combining, uploading) instead of one spinner. The header button is now a status indicator; it only asks for a hand when a sync fails for a reason a person has to resolve.
14
- - **"Project" is now "Topic"** and **"Kind" is now "Type"** throughout the interface. Nothing changes on disk: events still store `projects`, exactly as SPEC.md version 1 describes. `topic:` and `topics:` are accepted as search filters alongside `project:`.
58
+ - **"Project" is now "Topic"** and **"Kind" is now "Type"** throughout the interface, in the browser app and the terminal workspace alike. Nothing changes on disk: events still store `projects`, exactly as SPEC.md version 1 describes. `topic:` and `topics:` are accepted as search filters alongside `project:`.
15
59
  - **The timeline is paginated**, so a Roll with years of events stays responsive.
16
60
  - **Accessibility:** the app now meets WCAG 2.1 AA. Everything is reachable and operable from the keyboard, focus is always visible, dialogs replace the browser's own `alert`/`confirm`/`prompt`, results and errors are announced, and colours meet contrast requirements in both light and dark mode. Secondary text is slightly darker than before for that reason.
17
61
 
@@ -34,6 +78,16 @@ All notable changes to GitRoll are documented here. GitRoll follows [semantic ve
34
78
  ## 0.1.1 (2026-09-15)
35
79
 
36
80
  ### Added
81
+ - **Imports from GitHub and CI.** `gitroll import github` logs merged pull requests and releases, `gitroll import ci` logs builds that failed (`--status all` for the rest), for this Roll's own repository or one you name. Filter with `--since`, `--until`, `--branch`, `--author`, `--label`, `--status` and `--limit`, and see what would happen with `--dry-run`. GitHub is asked through the GitHub CLI if it's signed in, then `GITHUB_TOKEN`, then not at all; no token is ever stored. JSON piped in from `gh api` or a webhook works too. Nothing is logged twice — `source: { adapter, id }` is the thing's own identity, a repeated import starts where the last one left off and says so, and an event you edited after importing stays as you left it. See [docs/IMPORT.md](docs/IMPORT.md).
82
+ - **Ask your Roll is a normal feature**, not an experiment behind an environment variable. `gitroll ai` lists where a model can run (on your computer first, so nothing leaves it), `gitroll ai test` says which thing is wrong when it doesn't work, and `gitroll ai on`/`off` switches it without forgetting the settings. The app has the same thing behind ✨ in the header, and tests what you typed before it saves. Keys are read from environment variables and never stored; a Roll's `ai: false` still turns Ask off for everyone. Answers cite events and link to them, and an answer can be turned into a draft event — which stays a draft until you save it. `gitroll summary` drafts an update from a date range the same way.
83
+ - **The Roll's branch is visible**: in the browser header, the terminal header and `gitroll status` (including `--json`, which also carries the head commit, the repository and why syncing is blocked). A detached HEAD and a repository with no commits are named rather than guessed at, and syncing on a detached HEAD stops and says what to do.
84
+ - **Code references.** `#412`, `owner/repo#412`, a commit SHA and GitHub URLs in an event's text become links when the event says which repository it is about. `gitroll log --code` records the repository, branch and commit you're on, as `source: { repo, branch, commit }`.
85
+ - **`gitroll log --editor`** (and `gitroll edit --editor`), using `$VISUAL` or `$EDITOR`, and **`gitroll completion bash|zsh|fish`** for commands, Rolls, templates, tags, projects and saved searches.
86
+ - **Templates** for the kinds of event developers write often — debugging, incident, deployment, experiment and architecture decision — in `gitroll log --template`, `gitroll templates`, and the app's composer.
87
+ - **`gitroll restore`**, and *Put this version back* in History: an earlier version returns as a new commit, so nothing is ever rewritten.
88
+ - **`gitroll conflicts` and `gitroll resolve`**, and a Conflicts screen in the app: an event changed in two places, side by side, settled by keeping one version or writing one out of both. Both stay in history.
89
+ - **Related events and backlinks** from ordinary Markdown links between events (`gitroll related`, and on every event in the app).
90
+ - **Saved searches** (`gitroll find … --save <name>`, then `find @name`, `gitroll searches`) and **`gitroll find --all`** across every Roll on this computer.
37
91
  - **Scoop (Windows):** `scoop bucket add gitroll https://github.com/jimhoyd-com/scoop-bucket`, then `scoop install gitroll/gitroll`. Every release installs the manifest with Scoop on Windows before publishing. `gitroll version`, `upgrade` and `uninstall` recognize Scoop installs.
38
92
  - **npm:** `npm install --global gitroll`, published by the release workflow with provenance through npm trusted publishing (no stored npm token).
39
93
 
@@ -42,6 +96,16 @@ All notable changes to GitRoll are documented here. GitRoll follows [semantic ve
42
96
  First public release.
43
97
 
44
98
  ### Added
99
+ - **Imports from GitHub and CI.** `gitroll import github` logs merged pull requests and releases, `gitroll import ci` logs builds that failed (`--status all` for the rest), for this Roll's own repository or one you name. Filter with `--since`, `--until`, `--branch`, `--author`, `--label`, `--status` and `--limit`, and see what would happen with `--dry-run`. GitHub is asked through the GitHub CLI if it's signed in, then `GITHUB_TOKEN`, then not at all; no token is ever stored. JSON piped in from `gh api` or a webhook works too. Nothing is logged twice — `source: { adapter, id }` is the thing's own identity, a repeated import starts where the last one left off and says so, and an event you edited after importing stays as you left it. See [docs/IMPORT.md](docs/IMPORT.md).
100
+ - **Ask your Roll is a normal feature**, not an experiment behind an environment variable. `gitroll ai` lists where a model can run (on your computer first, so nothing leaves it), `gitroll ai test` says which thing is wrong when it doesn't work, and `gitroll ai on`/`off` switches it without forgetting the settings. The app has the same thing behind ✨ in the header, and tests what you typed before it saves. Keys are read from environment variables and never stored; a Roll's `ai: false` still turns Ask off for everyone. Answers cite events and link to them, and an answer can be turned into a draft event — which stays a draft until you save it. `gitroll summary` drafts an update from a date range the same way.
101
+ - **The Roll's branch is visible**: in the browser header, the terminal header and `gitroll status` (including `--json`, which also carries the head commit, the repository and why syncing is blocked). A detached HEAD and a repository with no commits are named rather than guessed at, and syncing on a detached HEAD stops and says what to do.
102
+ - **Code references.** `#412`, `owner/repo#412`, a commit SHA and GitHub URLs in an event's text become links when the event says which repository it is about. `gitroll log --code` records the repository, branch and commit you're on, as `source: { repo, branch, commit }`.
103
+ - **`gitroll log --editor`** (and `gitroll edit --editor`), using `$VISUAL` or `$EDITOR`, and **`gitroll completion bash|zsh|fish`** for commands, Rolls, templates, tags, projects and saved searches.
104
+ - **Templates** for the kinds of event developers write often — debugging, incident, deployment, experiment and architecture decision — in `gitroll log --template`, `gitroll templates`, and the app's composer.
105
+ - **`gitroll restore`**, and *Put this version back* in History: an earlier version returns as a new commit, so nothing is ever rewritten.
106
+ - **`gitroll conflicts` and `gitroll resolve`**, and a Conflicts screen in the app: an event changed in two places, side by side, settled by keeping one version or writing one out of both. Both stay in history.
107
+ - **Related events and backlinks** from ordinary Markdown links between events (`gitroll related`, and on every event in the app).
108
+ - **Saved searches** (`gitroll find … --save <name>`, then `find @name`, `gitroll searches`) and **`gitroll find --all`** across every Roll on this computer.
45
109
  - **Rolls:** plain Markdown-and-YAML records with attachments named by their SHA-256 hash, specified in SPEC.md.
46
110
  - **Local web app:** timeline, search with quick filters, projects, logging with photos and files, editing with history, and a sync button.
47
111
  - **CLI:** `setup`, `log`, `find`, `sync`, `rolls`, `switch`, `new`, `join`, `share`, `backup`, `rename`, `remove`, `projects`, `types`, `template`, `export`, `import`, `check`, `doctor`, `ask`, `ai`.
package/README.md CHANGED
@@ -4,7 +4,24 @@
4
4
 
5
5
  Write down what happened: the AC was serviced, you paid the contractor, you opened a bank account. Add a photo or a receipt. Find it again in seconds, years later.
6
6
 
7
- Your logbook, called a **Roll**, is a folder of plain files on your computer that you can back up to your own private GitHub repository.
7
+ Your logbook, called a **Roll**, is a `.gitroll/` folder of plain Markdown files in a Git repository of your own either a repository just for the log, or one that already holds a project.
8
+
9
+ **You don't need GitRoll to keep one.** An event is a Markdown file:
10
+
11
+ ```
12
+ .gitroll/events/2026-09-15-ac-serviced.md
13
+ ```
14
+
15
+ ```markdown
16
+ # AC serviced
17
+
18
+ Replaced the capacitor. Paid $325.
19
+ One-year warranty on the repair.
20
+
21
+ [Receipt](../files/ac-receipt.pdf)
22
+ ```
23
+
24
+ Commit it, push it, done. No front matter, no ids, no timestamps — the date comes from the file name. GitRoll is an app that reads and writes exactly this, and everything it can do, you can do with a text editor. The whole format is in [SPEC.md](SPEC.md).
8
25
 
9
26
  **GitRoll is free and open source (MIT).** There are no accounts, subscriptions, usage limits, telemetry or servers. Use it for anything, personal or commercial, on as many computers and Rolls as you like.
10
27
 
@@ -61,21 +78,75 @@ GitRoll opens right in your terminal: use ↑↓ to browse, `n` to log, `/` to f
61
78
 
62
79
  In the browser:
63
80
 
64
- - **Log:** start typing in the box at the top and click **Save** (or press `n` from anywhere, and `Ctrl`/`⌘`+`Enter` to save). Text is Markdown, `#tags` and amounts like `$40` are picked up as you type, and photos and files can be dropped or pasted straight in. The row of buttons under the box sets the type, the topic, when it happened and the amount — including logging something that happened last week.
81
+ - **Log:** start typing in the box at the top and click **Save** (or press `n` from anywhere, and `Ctrl`/`⌘`+`Enter` to save). Text is Markdown, `#tags` and amounts like `$40` are picked up as you type, and photos and files can be dropped or pasted straight in. The row of buttons under the box sets the topic, the date and the amount — including logging something that happened last week.
65
82
  - **Find:** type words in **Search**, or a filter like `has:photo`, `topic:house`, `after:2026-01-01` or `amount:>500`. Suggestions appear as you type; press `/` to jump to the box. The same filters work in `gitroll find`.
66
83
  - **Edit:** open an event and click **Edit**. **History** shows every earlier version.
67
- - **Back up:** GitRoll backs up by itself shortly after you save and when you come back to the window. The indicator in the header shows where that has got to; click it to back up now or to see why one failed.
84
+ - **Back up:** GitRoll never uploads on its own. Your events are saved and committed the moment you write them; sending them to your backup is something you ask for — `gitroll sync`, `/sync` in the terminal app, or the indicator in the header of the browser app, which shows how far behind the backup is and why a sync failed.
68
85
  - **Keyboard:** press `?` for the full list of shortcuts.
86
+ - **Ask:** press ✨ to set up a model — on your computer, so nothing leaves it — then ask questions in the search box. Every answer links to the events it came from. See [docs/AI.md](docs/AI.md).
69
87
 
70
88
  If the page asks you to open GitRoll from the link in your terminal, copy that link. It's a per-session key that keeps other programs on your computer out.
71
89
 
90
+ ## If you write code
91
+
92
+ A log that lives in the repository it is about answers the questions Git can't: why this, what we tried, what broke at 3am and what fixed it.
93
+
94
+ ```bash
95
+ cd ~/code/my-project
96
+ gitroll log --template incident --code --editor "Checkout timeouts"
97
+ ```
98
+
99
+ - **`--template`** opens one of `debugging`, `incident`, `deployment`, `experiment` or `decision` (an ADR) — headings worth answering, which you can delete if they don't apply.
100
+ - **`--code`** records the repository, branch and commit you're on, so the event knows which work it is about.
101
+ - **`--editor`** writes it in `$VISUAL` or `$EDITOR`.
102
+
103
+ Then `#412`, `owner/repo#412`, a commit SHA or a GitHub URL in the text become links to the right repository, and an ordinary Markdown link to another event (`[the incident](2026-09-14-checkout-timeouts.md)`) shows up on both events — the second one as a backlink.
104
+
105
+ The header (in the browser and the terminal) and `gitroll status` show which repository and **branch** the log itself is on, so you always know where what you write is going. `gitroll completion bash|zsh|fish` prints a completion script for commands, Rolls, templates, tags and saved searches.
106
+
107
+ | Command | What it does |
108
+ | --- | --- |
109
+ | `gitroll ask "what broke in checkout last month?"` | Answer from your events, with links to them |
110
+ | `gitroll summary --since 2026-09-01` | Draft an update from what you logged. Nothing is saved until you save it. |
111
+ | `gitroll restore <file>` | Put an earlier version back, as a new commit |
112
+ | `gitroll conflicts` / `gitroll resolve <file> --mine` | Settle an event that was changed in two places |
113
+ | `gitroll related <file>` | What it links to, and what links back |
114
+ | `gitroll find "tag:incident" --save incidents` | Keep a search; run it later with `gitroll find @incidents` |
115
+ | `gitroll find "postgres" --all` | Search every Roll you have |
116
+ | `gitroll import github` / `gitroll import ci` | Log merged pull requests and releases, and builds that failed |
117
+
118
+ A lot of what happened is already written down in merged pull requests and in the build that broke at 3am. `gitroll import github` and `gitroll import ci` bring those in as ordinary events — failures only by default, picking up where the last import left off, and never logging the same thing twice. See [docs/IMPORT.md](docs/IMPORT.md).
119
+
120
+ ## Adding a log to a project you already have
121
+
122
+ Run `gitroll` inside any Git repository. If it has no log yet, GitRoll offers to add one, to open a different Roll, or to cancel — and it creates nothing until you say so:
123
+
124
+ ```bash
125
+ cd ~/code/my-project
126
+ gitroll
127
+ ```
128
+
129
+ Choosing *Add a log to this repository* creates `.gitroll/` and nothing else. Your project's own README, files and branch are untouched, and GitRoll commits only the files it wrote, so anything you had staged or half-finished stays exactly as it was. From then on, decisions, incidents and releases live next to the code they are about:
130
+
131
+ ```
132
+ .gitroll/events/2026-09-15-auth-decision.md
133
+ ```
134
+
135
+ **`.gitroll/` is a namespace, not a privacy boundary.** The log is exactly as visible as the repository it lives in, so a log in a public repository is public.
136
+
72
137
  ## Your data lives in your own repository
73
138
 
74
- You don't fork or clone this repository to use GitRoll; it holds only the app's source code. `gitroll setup` creates a separate **private** repository in your own GitHub account for your Roll, containing only your entries and files. (A fork of this public repository couldn't be made private.)
139
+ You don't fork or clone this repository to use GitRoll; it holds only the app's source code. `gitroll setup` creates a separate **private** repository in your own GitHub account for your Roll, containing only your events and files. (A fork of this public repository couldn't be made private.)
75
140
 
76
141
  ## Upgrading
77
142
 
78
- Your Rolls contain no app code, so upgrading never changes them: new versions read the same files. If a future version ever needs to change the file format, it will tell you and make the change as a normal commit you can review.
143
+ Your Rolls contain no app code, so upgrading never changes them: new versions read the same files. `.gitroll/config.yaml` records which template revision your repository follows:
144
+
145
+ ```yaml
146
+ template_version: 1
147
+ ```
148
+
149
+ GitRoll reads that marker and never changes it while logging or editing — upgrading the app does not upgrade your repository. If a future version ever needs to change the format, it will say so, make the change as a normal commit you can review, and update the marker only once that has worked. A repository whose template is newer than your app refuses writes and tells you to upgrade; one that doesn't record a version is reported as unknown rather than assumed to be current (`gitroll template --set 1` records it).
79
150
 
80
151
  | How you installed | Upgrade with |
81
152
  | --- | --- |
@@ -118,15 +189,23 @@ Prefer to skip `gitroll setup`? Every release publishes the starter files to [ji
118
189
  git clone git@github.com:you/my-roll.git
119
190
  ```
120
191
 
121
- 3. Open it:
192
+ 3. Log something — with or without GitRoll:
193
+
194
+ ```bash
195
+ cd my-roll
196
+ $EDITOR .gitroll/events/2026-09-15-ac-serviced.md
197
+ git add .gitroll && git commit -m "AC serviced" && git push
198
+ ```
199
+
200
+ Or open it in the app, which checks the log, adds it to your list, and opens it:
122
201
 
123
202
  ```bash
124
203
  cd my-roll && gitroll
125
204
  ```
126
205
 
127
- GitRoll checks the Roll, adds it to your list, and opens it. To add it without opening, run `gitroll rolls add .` instead.
206
+ To add it without opening, run `gitroll rolls add .` instead.
128
207
 
129
- Running `gitroll` inside an **empty** folder or freshly cloned empty repository offers to set it up as a Roll. GitRoll never changes a folder that already has other files in it.
208
+ Running `gitroll` inside an **empty** folder offers to make it a Roll; inside a repository that already holds a project, it offers to add a `.gitroll/` folder to it. Either way it asks first and never touches anything else.
130
209
 
131
210
  ## Everyday commands
132
211
 
@@ -144,25 +223,61 @@ gitroll sync
144
223
 
145
224
  | Command | What it does |
146
225
  | --- | --- |
147
- | `gitroll` | Open GitRoll in the terminal (press `o` for the browser app) |
226
+ | `gitroll` | Open GitRoll in the terminal (`/web` opens the browser app) |
148
227
  | `gitroll open` | Open GitRoll in your browser |
149
228
  | `gitroll upgrade` / `gitroll uninstall` | Get the latest version, or remove the app (your Rolls stay) |
150
- | `gitroll menu` or `gitroll -i` | Full-screen terminal app: browse with arrow keys, `n` log, `/` find, `s` sync, `r` switch Roll |
229
+ | `gitroll menu` or `gitroll -i` | The workspace: type an entry at the prompt, `/` for commands, ↑↓ to browse |
151
230
  | `gitroll log "text" [files]` | Log something, with optional photos or receipts |
152
- | `gitroll find "words"` | Find events |
231
+ | `gitroll find "words"` | Find events (see [What search looks at](#what-search-looks-at)) |
153
232
  | `gitroll sync` | Back up, and get changes from anyone you share with |
154
233
  | `gitroll rolls` / `gitroll switch <name>` | See your Rolls and pick one |
155
- | `gitroll rolls add [folder]` | Add a Roll you cloned yourself |
234
+ | `gitroll rolls add [folder]` | Add a repository with a log that you cloned yourself |
235
+ | `gitroll init --dir <folder>` | Add a log (`.gitroll/`) to a repository you already have |
236
+ | `gitroll move <file> <new path>` | Rename or reorganize an event, keeping its links and history |
237
+ | `gitroll template` | Show the repository's template version (`--set 1` records one) |
156
238
  | `gitroll new "Business" --github` | Create another Roll with a private GitHub backup |
157
239
  | `gitroll share <github-user>` | Let someone else log in this Roll |
240
+ | `gitroll ai` / `gitroll ask "…"` | Set up a model, then ask questions of your own events |
241
+ | `gitroll log --template incident --code` | Start from a template, recording the branch and commit you're on |
242
+ | `gitroll restore <file>` / `gitroll conflicts` | Put a version back; settle an event changed in two places |
243
+ | `gitroll import github` / `gitroll import ci` | Log merged pull requests, releases and failed builds ([docs/IMPORT.md](docs/IMPORT.md)) |
244
+ | `gitroll completion <shell>` | Completion for bash, zsh or fish |
158
245
  | `gitroll doctor` | Check your setup, privacy and backup |
159
246
  | `gitroll help more` | Everything else |
160
247
 
161
248
  ### Interactive or basic
162
249
 
163
- - **Interactive:** `gitroll menu` (or `gitroll -i`) opens a full-screen terminal app. Move with ↑↓, Enter reads an entry, `n` logs something, `/` finds as you type, `s` syncs, `r` switches Roll, `o` opens the browser app and `q` quits. In a simple terminal it falls back to a numbered menu. Also, `gitroll log` with no text asks what happened, which files to attach (you can drag them into the terminal), and which project.
250
+ - **Interactive:** `gitroll` (or `gitroll menu` / `gitroll -i`) opens a workspace that stays open. Your recent entries sit above a prompt; type what happened and press Enter to log it. Press `/` for commands with descriptions and autocomplete `/log`, `/find`, `/topics`, `/roll`, `/sync`, `/status`, `/problems`, `/deleted`, `/web`, `/help` and `?` for the key list.
251
+
252
+ | Key | What it does |
253
+ | --- | --- |
254
+ | Enter | Log what's in the prompt, or open the entry you picked |
255
+ | ↑ ↓ | Pick one of the recent entries above the prompt |
256
+ | Ctrl+O | Open the full composer: text over several lines, date, amount, tags, topics and files, with topic and tag autocomplete |
257
+ | Ctrl+S | Save, in the composer |
258
+ | Ctrl+E | Edit the text in your own editor (`EDITOR` or `VISUAL`) |
259
+ | Ctrl+Z | Undo the last deletion |
260
+ | Ctrl+R | Re-read the Roll from its folder |
261
+ | Esc | Go back, one step at a time |
262
+ | Ctrl+C | Quit — unsaved text is kept as a draft and offered again next time |
263
+
264
+ `/find` searches as you type, shows the selected entry beside the results in a wide terminal, and gives you `Ctrl+O` to write a new entry, `Ctrl+E` to edit, `Ctrl+K` to duplicate and `Ctrl+D` to delete. Open an entry with Enter to edit (`e`), duplicate (`y`), attach files (`a`), open one of its files in the application that normally opens it (`o`, `Tab` to pick another), see its history (`h`) or delete it (`d`). Attached files are copied into `.gitroll/files/` and linked from the event, so the originals can move or go; unlinking one leaves the copy where it is, since another event may link the same file. Deleting an event only takes it off the timeline: `/deleted` lists what has gone and puts any of it back as a new change. The header always says which Roll you're in, where it lives, and whether your entries are backed up. In a simple terminal it falls back to a numbered menu. Also, `gitroll log` with no text asks what happened, which files to attach (you can drag them into the terminal), and which project.
164
265
  - **Basic:** every command also works in one line with no questions asked, for scripts and automation. Prompts and colors are off automatically outside a terminal, when `NO_COLOR` is set, or with `--plain`.
165
266
 
267
+ ### What search looks at
268
+
269
+ `gitroll find`, `/find` in the terminal app and the search box in the browser all read the same thing: **what you wrote.**
270
+
271
+ | Searched | Not searched |
272
+ | --- | --- |
273
+ | The words of an event, and its title | What's inside an attached file — no PDF text, no text in photos |
274
+ | Its topics and tags | Other Rolls, unless you ask with `--all` |
275
+ | Its amount and currency | Events you deleted (`/deleted` lists those) |
276
+ | Anything in its front matter | Older versions of an event (`gitroll history <id>` shows those) |
277
+ | Its file name, and the names of files attached to it | |
278
+
279
+ It covers this Roll as its files are right now, on the branch you're on. Filters combine: `topic:house tag:payment type:expense after:2026-01-01 before:2026-06-30 amount:>500 has:photo by:jimmy`.
280
+
166
281
  ## Sharing a Roll
167
282
 
168
283
  ```bash
@@ -173,11 +288,13 @@ They accept the GitHub invitation, install GitRoll, and run `gitroll join you/ho
173
288
 
174
289
  ## Templates and themes
175
290
 
176
- Add your own kinds of entries, save a Roll's setup as a template for new Rolls, and restyle GitRoll with a small CSS file. See [docs/TEMPLATES.md](docs/TEMPLATES.md).
291
+ Start new Rolls from a template repository, and restyle GitRoll with a small CSS file. See [docs/TEMPLATES.md](docs/TEMPLATES.md).
177
292
 
178
293
  ## Privacy
179
294
 
180
- - Your entries live only on your computer and, if you back up, in your own GitHub repository. GitRoll collects nothing and keeps no copy.
295
+ - Your events live only on your computer and, if you back up, in your own GitHub repository. GitRoll collects nothing and keeps no copy.
296
+ - **Ask uses the model you choose.** With one on your computer, nothing leaves it. With a hosted provider, GitRoll says exactly what is sent before you turn it on, never sends attachments, and never stores your API key — it reads the environment variable you name. A Roll can turn Ask off for everyone with `ai: false`.
297
+ - A log is as visible as the repository it is in. `.gitroll/` is a namespace, not a privacy boundary: in a public repository, the log is public.
181
298
  - It removes location data from photos, and warns before you save something that looks like a password or card number.
182
299
  - Before every sync it confirms your backup repository is private, and refuses to upload if it's public or it can't tell. It only opens on your own computer.
183
300
  - **Limitations:** files aren't encrypted, and deleting an entry doesn't erase it from history.
@@ -186,7 +303,7 @@ Details are in [SECURITY.md](SECURITY.md).
186
303
 
187
304
  ## For developers
188
305
 
189
- Every entry is a Markdown file with YAML front matter, so `git clone` gives you everything and your records stay readable without GitRoll. The format is specified in [SPEC.md](SPEC.md). The same rules are available as a library, [`@gitroll/core`](packages/core), for building your own tools.
306
+ Every event is a Markdown file, front matter optional, so `git clone` gives you everything and your records stay readable — and writable — without GitRoll. The format is specified in [SPEC.md](SPEC.md). The same rules are available as a library, [`@gitroll/core`](packages/core), for building your own tools.
190
307
 
191
308
  ```bash
192
309
  make setup
@@ -204,10 +321,10 @@ Run `make` to list every shortcut. See [CONTRIBUTING.md](CONTRIBUTING.md) to con
204
321
 
205
322
  | Path | What it is |
206
323
  | --- | --- |
207
- | `src/core` | The GitRoll Format: parsing, validation, event types, search, privacy checks (published as `@gitroll/core`) |
324
+ | `src/core` | The GitRoll format: parsing, validation, search, privacy checks (published as `@gitroll/core`) |
208
325
  | `src/node` | Git operations, the CLI and the local web server |
209
326
  | `src/web` | The browser interface |
210
- | `template` | Starter files for a new Roll (data only: no code or workflows) |
327
+ | `template` | Starter files for a new Roll: a `.gitroll/` folder and a short root README (data only: no code or workflows) |
211
328
 
212
329
  ## GitRoll.com
213
330
 
package/SECURITY.md CHANGED
@@ -24,16 +24,20 @@ GitRoll never asks for, stores or sends a GitHub password or token. Syncing runs
24
24
  - Uploaded HTML, SVG, XML and JavaScript are always downloaded, never rendered.
25
25
 
26
26
  **Files**
27
- - Every read and write is checked to stay inside the Roll folder. GitRoll never follows symbolic links, and `gitroll check` reports any it finds.
28
- - Attachments are named by their SHA-256 hash, so tampering shows up in `gitroll check`.
29
- - Templates can only add type definitions, projects, a README and a theme stylesheet. Code, scripts and workflows are never copied into a Roll.
27
+ - Every read and write is checked to stay inside the repository. GitRoll never follows symbolic links, and `gitroll check` reports any it finds.
28
+ - GitRoll reads and writes only `.gitroll/`, and commits only the files it wrote, so work in progress elsewhere in a repository is never swept into its commits.
29
+ - A link in an event is resolved inside the repository only. A link that climbs out of the root or starts at `/` is not an attachment, is never opened, and is reported by `gitroll check`.
30
+ - A file stored by GitRoll gets a readable name and never overwrites one that is already there (`ac-receipt-2.pdf`).
31
+ - A repository whose `template_version` is newer than the app blocks every write, so an older GitRoll can't half-rewrite a newer format.
32
+ - Templates can only add a config marker, a README and a theme stylesheet. Code, scripts and workflows are never copied into a Roll.
30
33
 
31
34
  **Privacy**
32
35
  - Location (GPS) data is removed from JPEG photos before they're saved. Turn this off per Roll with `attachments: { remove_location: false }`.
33
36
  - Saving an event warns if the text looks like a password, API key, private key, card number or Social Security number, and `gitroll check` lists such events.
34
37
  - Before every upload, sync checks each address `git push` would actually send to (including `pushurl` and `insteadOf` rewrites). It refuses if a GitHub repository is public, or if its privacy can't be confirmed (offline, rate limited). It also refuses non-GitHub hosts unless you explicitly run `gitroll trust <address>`. Nothing is cached, so every sync is checked.
35
- - Your display name comes from settings on your computer, never from the shared Roll, so collaborators can't sign events as each other.
36
- - "Ask your Roll" only sends questions and the matching events to an AI model on your computer, unless you explicitly allow a remote one. API keys are read from environment variables and never stored. A Roll can turn Ask off for everyone with `ai: false`.
38
+ - Events carry no author field. Who wrote and changed each one comes from Git history, so collaborators can't sign events as each other by editing a file.
39
+ - **"Ask your Roll" sends nothing anywhere by default.** It is off until you set it up, and a model on your own computer is what it offers first; with one, no part of an event leaves the machine. A non-local address has to be chosen deliberately, must be `https://`, and GitRoll says exactly what would be sent (your question and the text of the matching events; never attachments) before you turn it on. API keys are read from an environment variable you name and are never stored in settings or in a Roll. A Roll can turn Ask off for everyone with `ai: false`, and GitRoll honours that whatever an individual has set up.
40
+ - **AI never writes to a Roll.** An answer can be turned into a draft, and a draft is saved only when a person saves it.
37
41
  - `gitroll doctor` reviews your setup: repository visibility, credentials embedded in the backup address, your email appearing in history, commit signing, settings file permissions and AI endpoint.
38
42
 
39
43
  **Git behavior**
@@ -47,6 +51,7 @@ GitRoll never asks for, stores or sends a GitHub password or token. Syncing runs
47
51
 
48
52
  ## Limitations to understand
49
53
 
54
+ - **`.gitroll/` is a namespace, not a privacy boundary.** A log is exactly as visible as the repository it lives in. In a public repository, every event and every file in it is public.
50
55
  - **You're responsible for keeping your repository private.** GitRoll checks GitHub's visibility before syncing, but can't check other Git hosts, and can't stop you from making the repository public later.
51
56
  - **Delete isn't erasure.** Deleting an event hides it from the timeline, but it stays in Git history, as do its attachments, on every computer and repository that synced it. Truly removing data means rewriting history (for example with `git filter-repo`) on every copy. Removing a collaborator doesn't delete what they already downloaded.
52
57
  - **Files aren't encrypted.** Anyone with access to your computer, your backups or the GitHub repository can read them. Use full-disk encryption on your devices.