<feed xmlns='http://www.w3.org/2005/Atom'>
<title>hutch.git/Hutch/Views/Home, branch v3.5.0</title>
<subtitle>ios client for sourcehut. swiftui.
</subtitle>
<id>http://git.krz.sh/krz/hutch.git/atom?h=v3.5.0</id>
<link rel='self' href='http://git.krz.sh/krz/hutch.git/atom?h=v3.5.0'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/'/>
<updated>2026-07-16T00:31:17+00:00</updated>
<entry>
<title>fix: give inbox threads identity distinct from their grouping key</title>
<updated>2026-07-16T00:31:17+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-16T00:31:17+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=eff81f34bb51ecc6e0aa5d831567db2cea0527a9'/>
<id>urn:sha1:eff81f34bb51ecc6e0aa5d831567db2cea0527a9</id>
<content type='text'>
InboxThreadSummary.id returned threadGroupingKey, which is listRID plus the
subject with Re:/Fwd: stripped. Two unrelated threads on one list sharing a
subject therefore shared an id — common on sourcehut, where "[PATCH] test" is
an ordinary subject — which collides under Identifiable in every list that
renders these summaries.

Key id on the root Message-ID, which is unique per thread, and leave
threadGroupingKey subject-based so replies still collapse into one
conversation.

Read state moves to threadGroupingKey at each call site. It was already
keyed on that string via id, so persisted keys are unchanged and marking a
conversation read still covers the whole subject group, matching how
HomeViewModel already builds the key for isUnread.
</content>
</entry>
<entry>
<title>feat: add App Intents for Hutch navigation</title>
<updated>2026-05-14T18:27:41+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-05-14T18:18:55+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=51b2eb0e6296734960f37cebd40fee34a1f261f9'/>
<id>urn:sha1:51b2eb0e6296734960f37cebd40fee34a1f261f9</id>
<content type='text'>
- add read-only App Intents for core Hutch workflows
- route intents through the existing Hutch navigation/deep-link model
- expose Work Queue, Recent Activity, System Status, pinned resources, projects, failed builds, assigned tickets, saved searches, and search where supported
- keep App Intents non-mutating for the initial implementation
- preserve existing widget, Safari extension, and hutch:// routing behavior

References: https://todo.sr.ht/~ccleberg/hutch/71
</content>
</entry>
<entry>
<title>feat(cache): persist read-only API responses</title>
<updated>2026-05-07T01:41:49+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-05-07T01:41:49+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=205cf2687ce48f3d004792ff223422a86cc6bdbc'/>
<id>urn:sha1:205cf2687ce48f3d004792ff223422a86cc6bdbc</id>
<content type='text'>
Add a bounded stale-while-revalidate cache at the Sourcehut API boundary with
stable keys, centralized TTLs, request coalescing, payload hashing, and LRU disk
pruning.

Cache high-value read-only repo, build, ticket, project, profile, paste, and
Home/Work Queue data while keeping mutations network-only and invalidating
related prefixes after successful writes.

Add focused cache tests and implementation notes.
</content>
</entry>
<entry>
<title>fix: profile loading error and user-timeline prefs update</title>
<updated>2026-04-23T22:39:13+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-23T22:39:13+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=66601a8091a73f3e31f4fb534c38b3eca4756e93'/>
<id>urn:sha1:66601a8091a73f3e31f4fb534c38b3eca4756e93</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: collapse work inbox messages into thread summaries</title>
<updated>2026-04-20T18:15:04+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-20T18:15:04+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=380fb866d090c5f13b2ad3f88f1fe23c4ade4801'/>
<id>urn:sha1:380fb866d090c5f13b2ad3f88f1fe23c4ade4801</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: add mark all read actions and avoid resending unchanged repo metadata</title>
<updated>2026-04-20T18:04:57+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-20T18:04:57+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=8b73fd9cd43753b36b3ab3ca5e4dc83a47ea3480'/>
<id>urn:sha1:8b73fd9cd43753b36b3ab3ca5e4dc83a47ea3480</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: user-defined time period for recent builds card</title>
<updated>2026-04-20T17:42:09+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-20T17:42:09+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=454c459394437f346a2d08d59a5504c0f6ec299f'/>
<id>urn:sha1:454c459394437f346a2d08d59a5504c0f6ec299f</id>
<content type='text'>
- limit Home failed-build counts to a configurable lookback window
and add the setting under Behavior.
- make the Recent and Builds rows fully tappable across the
entire cell and add coverage for the new failed-build filtering.

Fixes: https://todo.sr.ht/~ccleberg/hutch/67
</content>
</entry>
<entry>
<title>fix: change failed builds card on home tab to navigate to builds tab instead of implementing its own view</title>
<updated>2026-04-20T17:31:57+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-20T17:31:57+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=32c0e55b0713a15094c1640e7af70e0ed19d78d6'/>
<id>urn:sha1:32c0e55b0713a15094c1640e7af70e0ed19d78d6</id>
<content type='text'>
Fixes: https://todo.sr.ht/~ccleberg/hutch/66
</content>
</entry>
<entry>
<title>fix: remove prototype screens from developer menu</title>
<updated>2026-04-14T15:42:05+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-14T15:42:05+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=205c8ea9b2c6dfa62bc8b2342d1aa71e2da7d6ac'/>
<id>urn:sha1:205c8ea9b2c6dfa62bc8b2342d1aa71e2da7d6ac</id>
<content type='text'>
- removed prototype screens
- limited Recent section to 3 items
- added initial support for tips

Fixes: https://todo.sr.ht/~ccleberg/hutch/65
</content>
</entry>
<entry>
<title>fix: centralize URLs, tighten models, and polish SwiftUI bindings</title>
<updated>2026-04-14T00:44:44+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-14T00:44:44+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=fe1ccc69661603d419a642a450e4ac9e1258adb0'/>
<id>urn:sha1:fe1ccc69661603d419a642a450e4ac9e1258adb0</id>
<content type='text'>
- Add shared HutchDeepLinkURL constants for app, widgets, and tests.
- Bump marketing version to 3.1.2 and build to 70 (app + widget extension).
- Point Hutch stats default base URL at HutchStatsAPI; add SRHTWebURL status
  incident feed and reuse it from SystemStatusService.
- Group Project into Metadata and Resources; split ContributionStatsResponse
  into StatsWindow and StatsTotals with updated decoding and tests.
- Replace @Bindable usage with explicit Bindings in Profile, Projects list,
  and repository ACL flows; simplify Home pinned-item helper; add no-op
  bodies on cancel alert buttons where the compiler requires a statement.
- Move repository row build-status indicator next to the relative-updated
  caption and reserve a fixed 8×8 slot so the row does not jump when status
  loads.
- Use NSString.lastPathComponent for build artifact filenames; collapse
  duplicate ACL error branches; minor HutchStats HTTP and XMLParserDelegate
  cleanups.
- Point widgets at HutchDeepLinkURL helpers; align tests with the new
  response and URL types.
</content>
</entry>
</feed>
