<feed xmlns='http://www.w3.org/2005/Atom'>
<title>emacs-wttrin, branch v0.3.2</title>
<subtitle>Emacs frontend for Igor Chubin's wttr.in weather service
</subtitle>
<id>https://git.cjennings.net/emacs-wttrin/atom?h=v0.3.2</id>
<link rel='self' href='https://git.cjennings.net/emacs-wttrin/atom?h=v0.3.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/'/>
<updated>2026-04-26T23:03:06+00:00</updated>
<entry>
<title>bump version to 0.3.2</title>
<updated>2026-04-26T23:03:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-26T23:03:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=fe653a231b186393b02a2723985e61ce97baba1c'/>
<id>urn:sha1:fe653a231b186393b02a2723985e61ce97baba1c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: omit :foreground from emoji icon face when no color provided</title>
<updated>2026-04-26T23:01:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-26T23:01:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=c5e5e1dfb808efa8724a993771e5258e728f83d1'/>
<id>urn:sha1:c5e5e1dfb808efa8724a993771e5258e728f83d1</id>
<content type='text'>
The font branch of wttrin--make-emoji-icon built its face plist with `:foreground foreground` even when foreground was nil, producing a literal `(:family ... :height 1.0 :foreground nil)`. The mode-line redisplays many times per second, and Emacs validates faces on every redisplay. A single fresh-cache state produced hundreds of "Invalid face attribute :foreground nil" warnings in *Messages*. The bug's been live since 2026-02-21 (b74b98f). The 130bbc07 helper extraction kept it in place.

Switch to backquote splicing so the :foreground key is included only when foreground is non-nil. Behavior is identical on the colored path. On the nil path the emoji renders with the default mode-line color, the same visible result as before, without the warning flood.
</content>
</entry>
<entry>
<title>test: regression lock for nil :foreground in --make-emoji-icon</title>
<updated>2026-04-26T22:59:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-26T22:59:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=8f3c770e062a9aefec17f6b5f4f0a5ed927ac603'/>
<id>urn:sha1:8f3c770e062a9aefec17f6b5f4f0a5ed927ac603</id>
<content type='text'>
When wttrin-mode-line-emoji-font is set and the cache is fresh, --make-emoji-icon was emitting a face plist of the form (:family ... :height 1.0 :foreground nil). Emacs validates faces on every redisplay, so a single fresh-cache state produced hundreds of "Invalid face attribute :foreground nil" warnings in *Messages*.

The new boundary test asserts the face plist omits :foreground entirely when the caller passes nil. The assertion uses plist-member, not plist-get. plist-get returns nil for both a missing key and a present key bound to nil. That's the exact distinction Emacs's redisplay validator cares about.
</content>
</entry>
<entry>
<title>feat: add IP geolocation command for setting wttrin-favorite-location</title>
<updated>2026-04-22T05:07:51+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T05:07:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=9958ec4c4396ae8435f7e1818ff383c05df47a14'/>
<id>urn:sha1:9958ec4c4396ae8435f7e1818ff383c05df47a14</id>
<content type='text'>
Lets users set `wttrin-favorite-location` by IP lookup instead of typing a city by hand. `M-x wttrin-set-location-from-geolocation` runs the lookup, shows the detected "City, Region" in a yes/no prompt, and on confirmation sets the variable for the session. The docstring points at `M-x customize-save-variable` for persistence across restarts.

The new `wttrin-geolocation.el` module provides the provider layer. Three providers come built in: ipapi.co (the default), ipinfo.io, and ipwho.is. All three are HTTPS, need no API key, and have free tiers large enough for interactive use. The module has three layers. Pure JSON parsers handle the per-provider quirks: ipapi's `error: true` flag, ipwho.is's `success: false` flag, ipinfo's HTTP-status-only signalling. A small fetch helper extracts the HTTP body. `wttrin-geolocation-detect` wires them together and calls back with "City, Region" on success, or nil on any failure (network error, HTTP 4xx or 5xx, malformed response, rate-limit signal).

Providers live in an alist keyed by symbol, with plist values for :name, :url, and :parser. To use a different provider, push an entry onto `wttrin-geolocation--providers` and select it via `wttrin-geolocation-provider`. No code change needed.

README gains a subsection under Mode-line Weather Display covering the command, how to persist the result, provider selection with free-tier limits, and the accuracy caveat for VPN or mobile-hotspot users.

39 new tests across the parser layer (10 ipapi, 6 ipinfo, 6 ipwhois), fetch-and-dispatch (11), and interactive command (6). Each suite covers Normal, Boundary, and Error categories. Tests mock `url-retrieve` and `yes-or-no-p` at their boundaries and run the real extract-and-parse pipeline underneath. Test suite: 333 → 373 passing.
</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>
<entry>
<title>add TESTING.org test suite reference</title>
<updated>2026-04-05T02:01:32+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-05T02:01:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=ade62aa1af12facf076982dd5b5bbad88f1d68f7'/>
<id>urn:sha1:ade62aa1af12facf076982dd5b5bbad88f1d68f7</id>
<content type='text'>
Quick-start commands, full Makefile target table, writing guide
with file template and naming conventions, testutil-wttrin.el API
docs, key patterns, and test inventory.
</content>
</entry>
<entry>
<title>bump version to 0.3.1</title>
<updated>2026-04-04T21:46:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-04T21:46:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=a0f1b4f07c98ab3d4d4b50a330822d0991b733a7'/>
<id>urn:sha1:a0f1b4f07c98ab3d4d4b50a330822d0991b733a7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: weather ASCII art wraps when window is narrow</title>
<updated>2026-04-04T21:41:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-04T21:41:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=797fa7a6f51211b1218a2c08ce57dbbab835610c'/>
<id>urn:sha1:797fa7a6f51211b1218a2c08ce57dbbab835610c</id>
<content type='text'>
Enable truncate-lines in wttrin-mode so the fixed-width weather art
clips at the window edge instead of wrapping and breaking the layout.
</content>
</entry>
<entry>
<title>fix: weather buffer shows location in lowercase</title>
<updated>2026-04-04T21:37:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-04T21:37:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=5463f104165185501be9cd6f7458d1b0cad856de'/>
<id>urn:sha1:5463f104165185501be9cd6f7458d1b0cad856de</id>
<content type='text'>
wttr.in returns "Weather report: new orleans, la" regardless of
query casing. Replace the lowercase location on the header line
with the user's original string after rendering.
</content>
</entry>
<entry>
<title>feat: specific error messages for fetch failures</title>
<updated>2026-04-04T21:32:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-04T21:32:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/emacs-wttrin/commit/?id=73c81a00a10766900318d86640249d1b54c6b351'/>
<id>urn:sha1:73c81a00a10766900318d86640249d1b54c6b351</id>
<content type='text'>
Add HTTP status code checking (wttrin--extract-http-status) and pass
error descriptions through the callback chain so users see "Location
not found (HTTP 404)" or "Network error — check your connection"
instead of the generic "Perhaps the location was misspelled?" for
every failure.

Also fix pre-existing bug where the condition-case error handler in
extract-response-body killed an unrelated buffer after unwind-protect
already cleaned up.

330 tests (was 307), all passing.
</content>
</entry>
</feed>
