<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/dashboard-config.el, branch load-graph-classify-start</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-start</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-start'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-05-24T12:45:14+00:00</updated>
<entry>
<title>refactor(linear): point config at the renamed pearl package</title>
<updated>2026-05-24T12:45:14+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T12:45:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=c858c74aa09667fbf899f587be816e8ad5e20d55'/>
<id>urn:sha1:c858c74aa09667fbf899f587be816e8ad5e20d55</id>
<content type='text'>
The linear-emacs package was renamed to pearl (~/code/pearl, feature pearl, all symbols pearl-*). Swapped every linear-emacs-* reference to pearl-* across linear-config.el (the use-package form, :load-path, the 26 :commands, the api-key/default-team-id/org-file-path vars, and the lazy-key advice targets pearl--graphql-request-async and pearl-check-setup), the dashboard launcher, and the two test files.

Kept the Linear-domain naming intact, since pearl is just a client for the Linear service: the C-; L prefix, the cj/linear-* wrapper helpers, the "Linear" dashboard label, the api.linear.app authinfo host, and the data/linear.org synced file are unchanged. Verified the wiring in a live daemon — pearl loads, the team id and org-file path apply, and the key advice installs on both entry points.
</content>
</entry>
<entry>
<title>feat(dashboard): add a Linear launcher and group the navigator by row sizes</title>
<updated>2026-05-24T05:03:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T05:03:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=835c2d3a4bd3f695889911edd7a9681c38ff8581'/>
<id>urn:sha1:835c2d3a4bd3f695889911edd7a9681c38ff8581</id>
<content type='text'>
I added a Linear entry to the launcher table, keyed l, with the nf-oct-issue_tracks octicon, opening the issue list via linear-emacs-list-issues. That makes 13 launchers, which no longer divides into the old rigid 4-per-row grid.

So I replaced the fixed chunk-by-4 with an explicit cj/dashboard--row-sizes (4 4 3 2) and reordered the table so Telegram comes before Slack, putting Slack and Linear together on the last row. The button shape moved into cj/dashboard--navigator-button, shared by the grouped loop and a fallback row for any launchers the sizes don't cover. A test pins the row sizes to the launcher count so they can't drift.
</content>
</entry>
<entry>
<title>refactor(dashboard): derive the navigator and keybindings from one launcher table</title>
<updated>2026-05-23T00:00:36+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-23T00:00:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5c160bd5f33b0e27ecac32af99f650ea50d844fe'/>
<id>urn:sha1:5c160bd5f33b0e27ecac32af99f650ea50d844fe</id>
<content type='text'>
The 12 dashboard launchers were inlined twice (once as navigator icon buttons, once as dashboard-mode-map keybindings), so adding or reordering one meant editing both lists, and the icon-row order could drift from the key order.

I pulled them into a single cj/dashboard--launchers table of (KEY ICON-FN ICON-NAME LABEL TOOLTIP ACTION) tuples. cj/dashboard--navigator-rows chunks it four per row into the navigator buttons, and cj/dashboard--bind-launchers binds each key to its action. The icons and the keys now come from one place, with no behavior change: same icons, labels, order, and keys, locked by tests.
</content>
</entry>
<entry>
<title>fix(dashboard): center the banner subtitle and color the navigator and items</title>
<updated>2026-05-22T23:15:00+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T23:15:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=11e3a27e752e845e583348c497b2c5b0208c8a52'/>
<id>urn:sha1:11e3a27e752e845e583348c497b2c5b0208c8a52</id>
<content type='text'>
The banner subtitle sat left of center because dashboard-banner-title-offset was 5, which over-shifts. I dropped it to 3, which lines the subtitle up under the banner image.

The navigator and the recentf/project/bookmark list rendered in the default near-white. I set dashboard-items-face to steel+2 so they pick up a theme color, and the section headers stay blue via dashboard-heading. The navigator and the items share dashboard-items-face, because the navigator is drawn with a dashboard-items-face overlay that wins over its per-button dashboard-navigator face, so they take one color by design here.
</content>
</entry>
<entry>
<title>fix(dashboard): trim padding newlines and reset window-start on open</title>
<updated>2026-05-21T02:23:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-21T02:23:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=4ac1b8161f7206592fa3d8efbf7eabb5c51b7bc6'/>
<id>urn:sha1:4ac1b8161f7206592fa3d8efbf7eabb5c51b7bc6</id>
<content type='text'>
The dashboard often opened already scrolled: content sat partly above the visible window with empty lines stranded at the bottom. There were two causes. The startupify list inserted five padding newlines that pushed the content past one screenful, and cj/dashboard-only moved point to point-min without resetting window-start, so a previously-scrolled view leaked into the next display.

I trimmed the padding to one newline after the banner title and one before the items, and added a set-window-start to point-min in cj/dashboard-only so the view always starts at the top. A characterization test locks the window-start reset.
</content>
</entry>
<entry>
<title>refactor(dashboard): regroup launcher icons into 4/4/4 by purpose</title>
<updated>2026-05-14T19:13:20+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-14T19:13:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=2a4637b401a3e47547edc21641512633647df35f'/>
<id>urn:sha1:2a4637b401a3e47547edc21641512633647df35f</id>
<content type='text'>
Telegram had landed alone on a third row of one icon, with the
first two rows holding a mixed bag (Code next to Email next to
Agenda next to Files next to Music; Feeds next to IRC next to
Slack next to Flashcards next to Books next to Terminal).  No
category showed up grouped, and the asymmetry was bugging me
every dashboard open.

Regroup by what the icons actually do.  Three rows of four:

- Row 1 Work:           Code   / Files       / Terminal / Agenda
- Row 2 Read &amp; Learn:   Feeds  / Books       / Flashcards / Music
- Row 3 Communication:  Email  / IRC         / Slack     / Telegram

Reorder the `define-key' calls on `dashboard-mode-map' to mirror
the row layout -- reading the keymap top-to-bottom now matches
reading the icons left-to-right.

Drive-by fix in the same commit: Music had an icon but no
`dashboard-mode-map' keybinding (mouse-only).  Bound to `m'.
</content>
</entry>
<entry>
<title>feat(telega-config): guard launcher with a helpful message when telega is missing</title>
<updated>2026-05-14T13:07:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-14T13:07:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=c123250c3cf928864aab118e1b9bfbaf9e1102b3'/>
<id>urn:sha1:c123250c3cf928864aab118e1b9bfbaf9e1102b3</id>
<content type='text'>
Without the guard, both `C-; G' and the dashboard Telegram icon
trigger telega's autoload stub directly.  When the package isn't
installed yet the user sees `Cannot open load file: telega' in
`*Messages*' with no hint about what to do.

Wrap the launcher in `cj/telega' that checks `featurep' /
`locate-library' first.  If telega is present, delegate to it.
Otherwise signal a `user-error' pointing at `scripts/setup-telega.sh'
and the manual `M-x package-install RET telega' fallback.  Rebind
`C-; G' and the dashboard "g" key + Telegram icon callback to the
wrapper.

Two new tests in `test-telega-config.el' cover the wrapper paths
(absent -&gt; user-error with the recovery hint; present -&gt; delegates
to `telega') alongside the updated binding assertion.
</content>
</entry>
<entry>
<title>feat(dashboard): add Telegram launcher to a new third row</title>
<updated>2026-05-13T21:09:54+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-13T21:09:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=1fc6925f9328ce7ce909aad0acf619d618eddcc2'/>
<id>urn:sha1:1fc6925f9328ce7ce909aad0acf619d618eddcc2</id>
<content type='text'>
`dashboard-navigator-buttons' grows a Row 3 with a single Telegram entry (using the `nf-fa-telegram' icon, launching `telega'). The dashboard-mode-map gets a single-letter `g' shortcut to match the other launcher keys.

Two follow-up TODOs filed under the parent telegram task: the TDLib docker setup script (so a fresh-clone install can boot telega without a system-wide TDLib build) and a dashboard-icon-balance pass (Row 3 with one entry is asymmetric; decide whether to leave it or reorganize).
</content>
</entry>
<entry>
<title>feat(dashboard): F1 lands point at the top of the buffer</title>
<updated>2026-04-25T09:10:43+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-25T09:10:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=fbca79c1e06b41099c1a4d18b587bc8c4611e777'/>
<id>urn:sha1:fbca79c1e06b41099c1a4d18b587bc8c4611e777</id>
<content type='text'>
cj/dashboard-only used to leave point wherever the dashboard buffer was last visited. Now it goes to point-min so the banner and navigator are visible on entry.
</content>
</entry>
<entry>
<title>feat: add Slack client module with dashboard integration</title>
<updated>2026-03-06T10:09:44+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-06T10:09:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=ce0eb84ba7cd2d3533dc1c7d1c2215760000a8fb'/>
<id>urn:sha1:ce0eb84ba7cd2d3533dc1c7d1c2215760000a8fb</id>
<content type='text'>
Add emacs-slack config with auth-source credentials, DM/mention-only
notifications via notify script, compose buffer workflow, and dashboard
icon. Keybindings under C-; S prefix.
</content>
</entry>
</feed>
