From 24c8bc6b44011bae35518d8a99f8ba4437cf5bd5 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Fri, 10 Apr 2026 11:39:57 -0500 Subject: bump version and update new privacy policy location --- .build.yml | 21 --- Hutch.xcodeproj/project.pbxproj | 40 +--- Hutch/Views/Settings/SettingsView.swift | 2 +- website/index.html | 166 ----------------- website/privacy.html | 130 ------------- website/storebutton.svg | 46 ----- website/styles.css | 320 -------------------------------- 7 files changed, 9 insertions(+), 716 deletions(-) delete mode 100644 .build.yml delete mode 100644 website/index.html delete mode 100644 website/privacy.html delete mode 100755 website/storebutton.svg delete mode 100644 website/styles.css diff --git a/.build.yml b/.build.yml deleted file mode 100644 index ba23305..0000000 --- a/.build.yml +++ /dev/null @@ -1,21 +0,0 @@ -image: alpine/edge -oauth: pages.sr.ht/PAGES:RW - -packages: - - hut - -sources: - - https://git.sr.ht/~ccleberg/Hutch - -environment: - site: hutch.cleberg.net - -tasks: - - package-site: | - set -euo pipefail - cd Hutch/website - tar -cvz . > ../../site.tar.gz - - - upload-site: | - set -euo pipefail - hut pages publish -d "$site" site.tar.gz diff --git a/Hutch.xcodeproj/project.pbxproj b/Hutch.xcodeproj/project.pbxproj index bc39cd4..5229238 100644 --- a/Hutch.xcodeproj/project.pbxproj +++ b/Hutch.xcodeproj/project.pbxproj @@ -18,10 +18,6 @@ 8B2FA9D22F7E211800E609E2 /* todo.json in Resources */ = {isa = PBXBuildFile; fileRef = 8B2FA9CA2F7E211800E609E2 /* todo.json */; }; 8B2FA9D32F7E211800E609E2 /* lists.json in Resources */ = {isa = PBXBuildFile; fileRef = 8B2FA9C72F7E211800E609E2 /* lists.json */; }; 8BE082012F80000100000001 /* HutchWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8BE081F62F80000100000001 /* HutchWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 8BE09E7F2F7B2CC300F88693 /* storebutton.svg in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7C2F7B2CC300F88693 /* storebutton.svg */; }; - 8BE09E802F7B2CC300F88693 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7A2F7B2CC300F88693 /* index.html */; }; - 8BE09E812F7B2CC300F88693 /* styles.css in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7D2F7B2CC300F88693 /* styles.css */; }; - 8BE09E822F7B2CC300F88693 /* privacy.html in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7B2F7B2CC300F88693 /* privacy.html */; }; 8BF100032F9A000100000001 /* Markdown in Frameworks */ = {isa = PBXBuildFile; productRef = 8BF100022F9A000100000001 /* Markdown */; }; 8BF100052F9A000100000002 /* Splash in Frameworks */ = {isa = PBXBuildFile; productRef = 8BF100042F9A000100000002 /* Splash */; }; /* End PBXBuildFile section */ @@ -73,10 +69,6 @@ 8B8182C22F6B742B000AE049 /* HutchTests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = HutchTests; sourceTree = ""; }; 8BDCA5272F6B76B20066AA29 /* HutchTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = HutchTests.xctestplan; sourceTree = ""; }; 8BE081F62F80000100000001 /* HutchWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = HutchWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8BE09E7A2F7B2CC300F88693 /* index.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; - 8BE09E7B2F7B2CC300F88693 /* privacy.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = privacy.html; sourceTree = ""; }; - 8BE09E7C2F7B2CC300F88693 /* storebutton.svg */ = {isa = PBXFileReference; lastKnownFileType = text; path = storebutton.svg; sourceTree = ""; }; - 8BE09E7D2F7B2CC300F88693 /* styles.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = styles.css; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -178,7 +170,6 @@ isa = PBXGroup; children = ( 8B2FA9CC2F7E211800E609E2 /* Docs */, - 8BE09E7E2F7B2CC300F88693 /* website */, 8BDCA5272F6B76B20066AA29 /* HutchTests.xctestplan */, 8B8182C22F6B742B000AE049 /* HutchTests */, 8B2F89632F69DEB900FC0253 /* LICENSE */, @@ -202,17 +193,6 @@ name = Products; sourceTree = ""; }; - 8BE09E7E2F7B2CC300F88693 /* website */ = { - isa = PBXGroup; - children = ( - 8BE09E7A2F7B2CC300F88693 /* index.html */, - 8BE09E7B2F7B2CC300F88693 /* privacy.html */, - 8BE09E7C2F7B2CC300F88693 /* storebutton.svg */, - 8BE09E7D2F7B2CC300F88693 /* styles.css */, - ); - path = website; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -348,10 +328,6 @@ 8B2FA9D12F7E211800E609E2 /* paste.json in Resources */, 8B2FA9D22F7E211800E609E2 /* todo.json in Resources */, 8B2FA9D32F7E211800E609E2 /* lists.json in Resources */, - 8BE09E7F2F7B2CC300F88693 /* storebutton.svg in Resources */, - 8BE09E802F7B2CC300F88693 /* index.html in Resources */, - 8BE09E812F7B2CC300F88693 /* styles.css in Resources */, - 8BE09E822F7B2CC300F88693 /* privacy.html in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -539,7 +515,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 26; + CURRENT_PROJECT_VERSION = 27; DEVELOPMENT_TEAM = ZCNAX3VL9D; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -556,7 +532,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.10.2; + MARKETING_VERSION = 2.10.3; PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -576,7 +552,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 26; + CURRENT_PROJECT_VERSION = 27; DEVELOPMENT_TEAM = ZCNAX3VL9D; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -593,7 +569,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.10.2; + MARKETING_VERSION = 2.10.3; PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -656,7 +632,7 @@ APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 26; + CURRENT_PROJECT_VERSION = 27; DEVELOPMENT_TEAM = ZCNAX3VL9D; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = HutchWidgetExtension/Info.plist; @@ -666,7 +642,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.10.2; + MARKETING_VERSION = 2.10.3; PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -685,7 +661,7 @@ APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 26; + CURRENT_PROJECT_VERSION = 27; DEVELOPMENT_TEAM = ZCNAX3VL9D; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = HutchWidgetExtension/Info.plist; @@ -695,7 +671,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.10.2; + MARKETING_VERSION = 2.10.3; PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/Hutch/Views/Settings/SettingsView.swift b/Hutch/Views/Settings/SettingsView.swift index 7f4aa07..2c9e528 100644 --- a/Hutch/Views/Settings/SettingsView.swift +++ b/Hutch/Views/Settings/SettingsView.swift @@ -746,7 +746,7 @@ private struct AboutView: View { .font(.subheadline) .foregroundStyle(.secondary) - Link(destination: URL(string: "https://hutch.cleberg.net/privacy.html")!) { + Link(destination: URL(string: "https://zerolabs.sh/hutch/privacy-policy/")!) { SwiftUI.Label("Privacy Policy", systemImage: "hand.raised") } } diff --git a/website/index.html b/website/index.html deleted file mode 100644 index 370e5c6..0000000 --- a/website/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Hutch — native SourceHut client for iOS - - - - - -
- - -
-
- Hutch is now available on the App Store for iPhone. - Download Hutch for SourceHut. -
-
-
-

Why it exists

-

SourceHut is intentionally simple, efficient, and workflow-focused. Hutch brings that same philosophy to - iOS with an interface designed for quick decisions and real work on the go.

-

Instead of treating mobile as a stripped-down viewer, Hutch is meant to be a practical client for reading, - responding, creating, and managing work across the SourceHut ecosystem.

-
- -
-

What it does

-
    -
  • Review patch threads and browse mailing lists
  • -
  • Manage trackers, tickets, assignees, labels, and comments
  • -
  • Browse Git and Mercurial repositories, files, refs, commits, and diffs
  • -
  • Submit, monitor, retry, and inspect builds and logs
  • -
  • Follow projects linking repositories, trackers, and lists
  • -
  • Manage profile settings, SSH keys, PGP keys, and access tokens
  • -
-
-
- -
-

Interface

-

From patch review to trackers, builds, repositories, and project organization, Hutch is - built to make SourceHut feel at home on iOS.

-
-
- Patch review screenshot -
Review patches anywhere
-
-
- Threaded inbox screenshot -
Stay on top of discussions
-
-
- Builds screenshot -
Monitor builds in real time
-
-
- Tickets screenshot -
Manage issues on the go
-
-
- Repository diff screenshot -
Explore your code
-
-
- Projects screenshot -
Everything in one place
-
-
- Build submission screenshot -
Take action instantly
-
-
-
- -
-
-

Major features

-
    -
  • Home dashboard with projects, assigned tickets, recent builds, and inbox shortcuts
  • -
  • Unread-first inbox with thread detail, patch rendering, and reply via Apple Mail
  • -
  • Git and Mercurial repository browsing, settings, ACLs, and creation flows
  • -
  • Tracker and ticket workflows including comments, assignees, resolutions, and labels
  • -
  • Build submission, build history, log viewing, cancellation, and rebuild flows
  • -
  • Project views linking repositories, trackers, and mailing lists into one hub
  • -
-
- -
-

Built for SourceHut users

-
    -
  • Native Swift interface with no analytics, ads, or tracking SDKs
  • -
  • Deep links for repositories, tickets, and builds via hutch://
  • -
  • Share actions across repositories, files, commits, tickets, builds, and profiles
  • -
  • Pull-to-refresh, loading states, empty states, and error overlays across major screens
  • -
  • Keychain-backed authentication with secure SourceHut personal access tokens
  • -
  • Profile management including avatars, SSH keys, PGP keys, and token/grant viewing
  • -
-
-
- -
-

Resources

- -
-
- - -
- - - diff --git a/website/privacy.html b/website/privacy.html deleted file mode 100644 index 371bbcb..0000000 --- a/website/privacy.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - Privacy Policy — Hutch - - - - -
- - -
-
-

Privacy Policy

- -

Hutch
- Last updated: March 20, 2026

- -

Overview

-

- Hutch is a native client for SourceHut on iPhone. It lets users work with repositories, - projects, mailing lists, tickets, and builds using their own SourceHut account. -

- -

Data Collection

-

- Hutch does not collect, store, or transmit personal data to the developer. -

-

- All data shown in the app is retrieved directly from SourceHut using credentials provided by the - user. -

- -

Authentication

-

- Hutch uses a SourceHut Personal Access Token (PAT) provided by the user. -

-

- The token is stored securely on-device using iOS secure storage and is used only to authenticate - requests - to SourceHut. The developer does not have access to this token. -

- -

Data Usage

-

The app communicates with SourceHut servers to:

-
    -
  • fetch repositories, files, commits, and project metadata
  • -
  • retrieve and update trackers, tickets, labels, and comments
  • -
  • read mailing lists, inbox threads, and patch discussions
  • -
  • submit, inspect, cancel, and rebuild build jobs
  • -
  • manage profile data, avatars, SSH keys, PGP keys, and access tokens
  • -
-

- No data is transmitted to any servers operated by the developer. -

- -

Third-Party Services

-

- Hutch communicates with SourceHut services (sr.ht) to retrieve and update user data. -

-

- When replying to mailing list threads, Hutch can hand the message off to Apple Mail using the iOS - Mail composer. -

-

- No analytics, advertising, or tracking SDKs are used. -

- -

User-Generated Content

-

- Hutch displays and edits content from SourceHut, including repositories, tickets, mailing list - threads, - and builds. This content is accessed based on the user’s authentication and permissions. -

- -

Device Permissions

-

- Hutch may request access to Photos when the user chooses to upload a profile avatar. -

-

- Hutch does not request access to location, contacts, camera, or microphone. -

- -

Changes to This Policy

-

- This policy may be updated in future versions. Updates will be reflected on this page. -

- -

Contact

-

- For questions, contact: - privacy@cleberg.net -

-
-
- - -
- - - diff --git a/website/storebutton.svg b/website/storebutton.svg deleted file mode 100755 index 072b425..0000000 --- a/website/storebutton.svg +++ /dev/null @@ -1,46 +0,0 @@ - - Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/styles.css b/website/styles.css deleted file mode 100644 index 11799c0..0000000 --- a/website/styles.css +++ /dev/null @@ -1,320 +0,0 @@ -:root { - --bg: #f3f3f1; - --surface: #fff; - --border: #ddd; - --text: #111; - --muted: rgba(0, 0, 0, 0.62); - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06); - --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.06); -} - -* { - box-sizing: border-box; -} - -body { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - background: var(--bg); - color: var(--text); - margin: 0; -} - -a, -a:visited { - color: blue; -} - -img { - max-width: 100%; - display: block; -} - -.page { - max-width: 960px; - margin: 0 auto; - padding: 16px; -} - -.privacy, -.site-header, -.content-grid, -.screenshots, -.resources, -.feature-sections { - border: 1px solid var(--border); - background: var(--surface); - margin-bottom: 16px; - padding: 20px; -} - -.brand-row { - display: flex; - justify-content: space-between; - gap: 20px; - align-items: flex-start; -} - -.brand, -.brand h1, -.brand p { - color: black; - text-decoration: none; -} - -.brand { - display: flex; - gap: 16px; - align-items: center; - min-width: 0; -} - -.brand h1 { - margin: 0; -} - -.subtitle, -.brand p { - margin-top: 0; - opacity: 0.68; -} - -.app-icon { - width: 80px; - border-radius: 18px; - border: 1px solid rgba(0, 0, 0, 0.08); - box-shadow: var(--shadow-sm), 0 4px 12px rgba(0, 0, 0, 0.08); - flex: 0 0 auto; -} - -.hero-actions { - text-align: right; - flex: 0 0 auto; -} - -.store-img { - height: 40px; - padding-bottom: 0.5rem; -} - -.header-links { - font-size: 14px; -} - -.intro-copy { - margin-top: 18px; -} - -.lede { - margin: 0 0 10px; - font-weight: 700; - font-size: 1.125rem; -} - -.intro-copy p:last-child { - margin-bottom: 0; -} - -.content-grid, -.feature-sections { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 20px; -} - -.content-grid>div, -.feature-sections>.feature-panel { - min-width: 0; -} - -.content-grid h2, -.screenshots h2, -.resources h2, -.feature-panel h2 { - margin-top: 0; -} - -.feature-list { - margin: 0; - padding-left: 1.2rem; - line-height: 1.55; -} - -.feature-list li+li { - margin-top: 0.45rem; -} - -.section-intro { - margin-top: 0; - color: var(--muted); -} - -.shot-scroll { - display: grid; - grid-auto-flow: column; - grid-auto-columns: minmax(220px, 280px); - gap: 12px; - overflow-x: auto; - overscroll-behavior-x: contain; - padding-bottom: 8px; - scroll-snap-type: x proximity; - -webkit-overflow-scrolling: touch; -} - -.shot-scroll::-webkit-scrollbar { - height: 10px; -} - -.shot-scroll::-webkit-scrollbar-thumb { - background: rgba(0, 0, 0, 0.18); -} - -.shot-card { - margin: 0; - scroll-snap-align: start; - border: 1px solid var(--border); - overflow: hidden; - background: #fafafa; - box-shadow: var(--shadow-md); -} - -.shot-card img { - width: 100%; - height: auto; -} - -.shot-card figcaption { - padding: 10px 12px 12px; - font-size: 0.95rem; - font-weight: 600; -} - -.resource-list { - display: flex; - flex-direction: column; - gap: 6px; - margin: 0; - padding-left: 1.2rem; -} - -.resource-list ul { - margin-top: 6px; -} - -.site-footer, -footer { - padding: 4px 2px 24px; -} - -.privacy h2 { - margin: 0 0 20px; - font-size: 28px; - line-height: 1.1; -} - -.privacy h3 { - margin: 24px 0 8px; - font-size: 18px; - line-height: 1.2; -} - -.privacy p { - margin: 0 0 14px; - line-height: 1.5; -} - -.privacy ul { - margin: 0 0 14px; - padding-left: 0; - list-style: none; -} - -.privacy li { - padding-left: 1em; - text-indent: -1em; -} - -.privacy li::before { - content: "- "; -} - -.privacy a:hover { - text-decoration: underline; -} - -code { - font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - font-size: 0.95em; -} - -@media (max-width: 760px) { - .page { - padding: 12px; - } - - .brand-row, - .content-grid, - .feature-sections { - grid-template-columns: 1fr; - display: grid; - } - - .shot-scroll { - grid-auto-columns: minmax(240px, 78vw); - } - - .brand-row { - gap: 16px; - } - - .hero-actions { - text-align: left; - } - - .brand { - align-items: flex-start; - } - - .store-img { - height: 44px; - } - - .content-grid, - .feature-sections { - gap: 12px; - } - - .site-header, - .content-grid, - .screenshots, - .resources, - .feature-sections, - .privacy { - padding: 16px; - } - - .feature-list, - .resource-list { - padding-left: 1.1rem; - } -} - -.info-banner { - margin: 24px auto; - padding: 14px 16px; - max-width: 960px; - - background: #fff3cd; - border: 1px solid #ffeeba; - - color: #856404; - font-size: 14px; - line-height: 1.5; - - text-align: center; -} - -.info-banner-live { - background: #edf7ee; - border-color: #cfe8d3; - color: #1d5c2f; -} -- cgit v1.2.3