<feed xmlns='http://www.w3.org/2005/Atom'>
<title>emacs-wttrin/.gitignore, branch release/0.4.0</title>
<subtitle>Emacs frontend for Igor Chubin's wttr.in weather service
</subtitle>
<id>https://git.cjennings.net/emacs-wttrin/atom?h=release%2F0.4.0</id>
<link rel='self' href='https://git.cjennings.net/emacs-wttrin/atom?h=release%2F0.4.0'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/'/>
<updated>2026-07-03T02:37:06+00:00</updated>
<entry>
<title>fix: persist runtime favorite and saved locations in a state file</title>
<updated>2026-07-03T02:37:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-03T02:37:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=8b461ecd3d4fae3be0a93523d19932e0a3d21c6c'/>
<id>urn:sha1:8b461ecd3d4fae3be0a93523d19932e0a3d21c6c</id>
<content type='text'>
savehist rewrites its whole file on every save, keeping only the variables registered in the running process. Any Emacs that saved savehist without wttrin loaded (a batch tool, a session that never opened wttrin) silently deleted the persisted favorite and saved-location entries. A d-set default then reverted to the init value on the next restart.

The runtime favorite and directory now live in wttrin-state-file, written only by wttrin: write-through on every location command, atomic temp-file + rename, UTF-8 pinned both ways, read with read (never eval), versioned plist. Values restore at load and re-assert on savehist-mode-hook, so a stale legacy savehist restore can't clobber them. With no state file present, legacy savehist values are adopted and written once, so existing users migrate with zero steps. Search history stays on savehist. It's scrub-tolerant throwaway data, exactly what savehist is for.

Also: the README documents the mode-line tooltip forecast option, and the gitignore covers one more local tooling artifact.
</content>
</entry>
<entry>
<title>chore: extend gitignore for a local tooling artifact</title>
<updated>2026-07-01T18:12:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-01T18:12:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=ad22b39fb5661a6662865c0e88dcfb0d1627eeb4'/>
<id>urn:sha1:ad22b39fb5661a6662865c0e88dcfb0d1627eeb4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: add external-command geolocation, opt-out, and example adapters</title>
<updated>2026-06-25T20:03:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-25T20:03:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=7027cccea9eb7170ea0f08e1def3f979f2e59932'/>
<id>urn:sha1:7027cccea9eb7170ea0f08e1def3f979f2e59932</id>
<content type='text'>
These build on the current-location picker with the rest of the geolocation work.

wttrin-geolocation-command runs a command that prints {lat,lng} (and optionally an address) and queries wttr.in by those coordinates. IP geolocation only finds the network's exit point, which is wrong on a VPN or hotspot. A command that scans nearby WiFi resolves to street level. It runs asynchronously, falls back to the IP provider when unset or failing, and assumes nothing about the OS, so it's inert until set. When the command returns an address, wttrin shows it on a "Location:" line, so the resolved place is readable even though the fetch is by raw coordinates.

wttrin-use-current-location is a labeled command that sets the favorite to auto-detect, so the bare t value never has to be typed into init by hand.

wttrin-geolocation-enabled (default t) turns every geolocation surface off for anyone who wants that: the picker entry, the auto-detect favorite, and the command.

examples/geolocation/ ships two reference adapters for the command: google-geolocate.py (Google API, key via the environment or ~/.authinfo.gpg) and apple-wps.py (Apple's keyless WiFi positioning, which uses an undocumented endpoint, so read its caveat). Both are Python 3 standard library and scan via nmcli, with notes on adapting the scan to other systems.
</content>
</entry>
<entry>
<title>chore: extend gitignore for local tooling and build artifacts</title>
<updated>2026-06-21T06:07:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-21T06:04:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=275f84076988ee32d976a578d79cf0b22dea6467'/>
<id>urn:sha1:275f84076988ee32d976a578d79cf0b22dea6467</id>
<content type='text'>
</content>
</entry>
<entry>
<title>chore: gitignore editor backup files</title>
<updated>2026-06-05T03:28:24+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-05T03:28:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=bdd3fc2bd57cd016c8cb701911660d9f09192daf'/>
<id>urn:sha1:bdd3fc2bd57cd016c8cb701911660d9f09192daf</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: add wttrin-display-options for wttr.in flag customization (closes #3)</title>
<updated>2026-05-05T14:48:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T14:48:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=ec00dbe1c03527ec46a0faa20545a7acd382da84'/>
<id>urn:sha1:ec00dbe1c03527ec46a0faa20545a7acd382da84</id>
<content type='text'>
wttr.in accepts single-character flags appended to the URL that control what the report looks like — no Follow line (F), narrow output (n), quiet mode (q), forecast horizon (0/1/2), console-glyph mode (d), and so on. Until now wttrin always used the same default report shape with no way to opt into these.

Added a `wttrin-display-options` defcustom that takes a string of concatenated flags, e.g. "0Fq" for current weather only with no Follow line and no header. The flags get appended to every request via `wttrin--build-url`. The defcustom defaults to nil so existing users see no change.

I excluded `A` and `T` from the recommended set in the docstring since wttrin needs ANSI output for the xterm-color rendering to produce the colored glyphs. The user could still pass them, but the docstring nudges them away.

Tests cover the normal cases (single, multi-flag, with and without unit system), the boundaries (nil and empty string both leave the URL unchanged from baseline, single character works), and a sanity check that the new flags slot in after the always-on `A`. Existing build-url tests stay green because they don't bind the new variable, and the default is nil.

Also added `.claude/` to .gitignore — the scheduled-tasks lockfile from local wakeup scheduling shouldn't be tracked.
</content>
</entry>
<entry>
<title>test: cover wttrin-debug.el and expand lint to all source files</title>
<updated>2026-05-05T10:11:55+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:11:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=ba22e0cc3c81d85b3ee8aaa337d6a388627c3af2'/>
<id>urn:sha1:ba22e0cc3c81d85b3ee8aaa337d6a388627c3af2</id>
<content type='text'>
I added 24 unit tests across six new files for wttrin-debug.el. They cover enable/disable, the debug-log writer, clear-log, show-log, and the mode-line diagnostic dump. That lifts wttrin-debug.el coverage from 27% to 95%, and overall coverage from 84% to 94%. Each function gets Normal / Boundary / Error categories where applicable. Globals like `wttrin-debug` and `wttrin--debug-log` are isolated per test with let-bindings. The dynamic-scope rebinding restores state cleanly at exit.

I expanded the `lint` target to run on all three source files instead of just `wttrin.el`. Checkdoc and elisp-lint run on every file. Package-lint stays scoped to `wttrin.el` because the others aren't standalone packages.

The tricky bit: `elisp-lint-file` re-runs package-lint internally as one of its validators. So the explicit guard alone wasn't enough. The fix binds `elisp-lint-ignored-validators` to include "package-lint" for the secondaries, which suppresses the re-run at the validator level.

I also added `*-autoloads.el` to .gitignore. Eask generates `emacs-wttrin-autoloads.el` during install, and it shouldn't be tracked.

I skipped one function: `wttrin--debug-mode-line-info` is a one-line dispatcher to `debug-wttrin-mode-line`. Testing it would assert the dispatch happened, which only tests Emacs.
</content>
</entry>
<entry>
<title>build: switch Makefile to eask, wire up undercover coverage</title>
<updated>2026-05-05T09:58:34+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T09:58:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=6554cb8000a8f471f7c9e050e284f3fc364d5dad'/>
<id>urn:sha1:6554cb8000a8f471f7c9e050e284f3fc364d5dad</id>
<content type='text'>
I wanted a coverage number, so I added an Eask file declaring the runtime dep (xterm-color) plus three dev deps (undercover, package-lint, elisp-lint). The Makefile now runs every test and lint recipe through `eask emacs`. That drops the hand-rolled `(require 'package)` + `add-to-list 'package-archives` boilerplate that was duplicated across six recipes.

I added a `make deps` target that runs `eask install-deps --dev`. I also added a `make coverage` target that loads `tests/run-coverage-file.el` before each unit-test file. Undercover instruments the three source files first, then the test loads pick up the instrumented copy. Per-file results merge into `.coverage/simplecov.json` in simplecov format.

I expanded `validate-parens` and `compile` to cover all three source files instead of just `wttrin.el`. Lint stays scoped to the main file for now.

Coverage right now is 84% overall: wttrin.el 92%, wttrin-geolocation.el 100%, wttrin-debug.el 27%. The debug module is low because only the integration test exercises it. The coverage loop runs unit tests only.
</content>
</entry>
<entry>
<title>chore: untrack .stignore</title>
<updated>2026-04-27T01:08:50+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-27T01:08:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=a7e2eda6f36cb490a59f6c2670839ab1e52049fc'/>
<id>urn:sha1:a7e2eda6f36cb490a59f6c2670839ab1e52049fc</id>
<content type='text'>
Stop tracking the Syncthing ignore file. It's local-machine config,
not project content. Add it to .gitignore so the file stays put
locally without showing up in git status.
</content>
</entry>
<entry>
<title>restructure: move docs/ to .ai/ + sync latest template</title>
<updated>2026-04-20T13:36:28+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-20T13:36:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=603f70d78f771c0a14c7f312aee6da68060b5d8b'/>
<id>urn:sha1:603f70d78f771c0a14c7f312aee6da68060b5d8b</id>
<content type='text'>
Per claude-templates c36fd14. Claude tooling moves to hidden .ai/;
project-level docs/ reserved for real documentation.
</content>
</entry>
</feed>
