Commit 8c11fe3d13
Unsigned
Layout: unified · split
.build.yml deleted −21
| @@ -1,21 +0,0 @@ | ||
| 1 | image: alpine/edge | |
| 2 | oauth: pages.sr.ht/PAGES:RW | |
| 3 | ||
| 4 | packages: | |
| 5 | - hut | |
| 6 | ||
| 7 | sources: | |
| 8 | - https://git.sr.ht/~ccleberg/Hutch | |
| 9 | ||
| 10 | environment: | |
| 11 | site: hutch.cleberg.net | |
| 12 | ||
| 13 | tasks: | |
| 14 | - package-site: | | |
| 15 | set -euo pipefail | |
| 16 | cd Hutch/website | |
| 17 | tar -cvz . > ../../site.tar.gz | |
| 18 | ||
| 19 | - upload-site: | | |
| 20 | set -euo pipefail | |
| 21 | hut pages publish -d "$site" site.tar.gz | |
Hutch.xcodeproj/project.pbxproj +8 −32
| @@ -18,10 +18,6 @@ | ||
| 18 | 18 | 8B2FA9D22F7E211800E609E2 /* todo.json in Resources */ = {isa = PBXBuildFile; fileRef = 8B2FA9CA2F7E211800E609E2 /* todo.json */; }; |
| 19 | 19 | 8B2FA9D32F7E211800E609E2 /* lists.json in Resources */ = {isa = PBXBuildFile; fileRef = 8B2FA9C72F7E211800E609E2 /* lists.json */; }; |
| 20 | 20 | 8BE082012F80000100000001 /* HutchWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8BE081F62F80000100000001 /* HutchWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; |
| 21 | 8BE09E7F2F7B2CC300F88693 /* storebutton.svg in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7C2F7B2CC300F88693 /* storebutton.svg */; }; | |
| 22 | 8BE09E802F7B2CC300F88693 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7A2F7B2CC300F88693 /* index.html */; }; | |
| 23 | 8BE09E812F7B2CC300F88693 /* styles.css in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7D2F7B2CC300F88693 /* styles.css */; }; | |
| 24 | 8BE09E822F7B2CC300F88693 /* privacy.html in Resources */ = {isa = PBXBuildFile; fileRef = 8BE09E7B2F7B2CC300F88693 /* privacy.html */; }; | |
| 25 | 21 | 8BF100032F9A000100000001 /* Markdown in Frameworks */ = {isa = PBXBuildFile; productRef = 8BF100022F9A000100000001 /* Markdown */; }; |
| 26 | 22 | 8BF100052F9A000100000002 /* Splash in Frameworks */ = {isa = PBXBuildFile; productRef = 8BF100042F9A000100000002 /* Splash */; }; |
| 27 | 23 | /* End PBXBuildFile section */ |
| @@ -73,10 +69,6 @@ | ||
| 73 | 69 | 8B8182C22F6B742B000AE049 /* HutchTests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = HutchTests; sourceTree = "<group>"; }; |
| 74 | 70 | 8BDCA5272F6B76B20066AA29 /* HutchTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = HutchTests.xctestplan; sourceTree = "<group>"; }; |
| 75 | 71 | 8BE081F62F80000100000001 /* HutchWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = HutchWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; |
| 76 | 8BE09E7A2F7B2CC300F88693 /* index.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = index.html; sourceTree = "<group>"; }; | |
| 77 | 8BE09E7B2F7B2CC300F88693 /* privacy.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = privacy.html; sourceTree = "<group>"; }; | |
| 78 | 8BE09E7C2F7B2CC300F88693 /* storebutton.svg */ = {isa = PBXFileReference; lastKnownFileType = text; path = storebutton.svg; sourceTree = "<group>"; }; | |
| 79 | 8BE09E7D2F7B2CC300F88693 /* styles.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = styles.css; sourceTree = "<group>"; }; | |
| 80 | 72 | /* End PBXFileReference section */ |
| 81 | 73 | |
| 82 | 74 | /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ |
| @@ -178,7 +170,6 @@ | ||
| 178 | 170 | isa = PBXGroup; |
| 179 | 171 | children = ( |
| 180 | 172 | 8B2FA9CC2F7E211800E609E2 /* Docs */, |
| 181 | 8BE09E7E2F7B2CC300F88693 /* website */, | |
| 182 | 173 | 8BDCA5272F6B76B20066AA29 /* HutchTests.xctestplan */, |
| 183 | 174 | 8B8182C22F6B742B000AE049 /* HutchTests */, |
| 184 | 175 | 8B2F89632F69DEB900FC0253 /* LICENSE */, |
| @@ -202,17 +193,6 @@ | ||
| 202 | 193 | name = Products; |
| 203 | 194 | sourceTree = "<group>"; |
| 204 | 195 | }; |
| 205 | 8BE09E7E2F7B2CC300F88693 /* website */ = { | |
| 206 | isa = PBXGroup; | |
| 207 | children = ( | |
| 208 | 8BE09E7A2F7B2CC300F88693 /* index.html */, | |
| 209 | 8BE09E7B2F7B2CC300F88693 /* privacy.html */, | |
| 210 | 8BE09E7C2F7B2CC300F88693 /* storebutton.svg */, | |
| 211 | 8BE09E7D2F7B2CC300F88693 /* styles.css */, | |
| 212 | ); | |
| 213 | path = website; | |
| 214 | sourceTree = "<group>"; | |
| 215 | }; | |
| 216 | 196 | /* End PBXGroup section */ |
| 217 | 197 | |
| 218 | 198 | /* Begin PBXNativeTarget section */ |
| @@ -348,10 +328,6 @@ | ||
| 348 | 328 | 8B2FA9D12F7E211800E609E2 /* paste.json in Resources */, |
| 349 | 329 | 8B2FA9D22F7E211800E609E2 /* todo.json in Resources */, |
| 350 | 330 | 8B2FA9D32F7E211800E609E2 /* lists.json in Resources */, |
| 351 | 8BE09E7F2F7B2CC300F88693 /* storebutton.svg in Resources */, | |
| 352 | 8BE09E802F7B2CC300F88693 /* index.html in Resources */, | |
| 353 | 8BE09E812F7B2CC300F88693 /* styles.css in Resources */, | |
| 354 | 8BE09E822F7B2CC300F88693 /* privacy.html in Resources */, | |
| 355 | 331 | ); |
| 356 | 332 | runOnlyForDeploymentPostprocessing = 0; |
| 357 | 333 | }; |
| @@ -539,7 +515,7 @@ | ||
| 539 | 515 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; |
| 540 | 516 | CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements; |
| 541 | 517 | CODE_SIGN_STYLE = Automatic; |
| 542 | CURRENT_PROJECT_VERSION = 26; | |
| 518 | CURRENT_PROJECT_VERSION = 27; | |
| 543 | 519 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 544 | 520 | ENABLE_PREVIEWS = YES; |
| 545 | 521 | GENERATE_INFOPLIST_FILE = YES; |
| @@ -556,7 +532,7 @@ | ||
| 556 | 532 | "$(inherited)", |
| 557 | 533 | "@executable_path/Frameworks", |
| 558 | 534 | ); |
| 559 | MARKETING_VERSION = 2.10.2; | |
| 535 | MARKETING_VERSION = 2.10.3; | |
| 560 | 536 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch; |
| 561 | 537 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 562 | 538 | STRING_CATALOG_GENERATE_SYMBOLS = YES; |
| @@ -576,7 +552,7 @@ | ||
| 576 | 552 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; |
| 577 | 553 | CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements; |
| 578 | 554 | CODE_SIGN_STYLE = Automatic; |
| 579 | CURRENT_PROJECT_VERSION = 26; | |
| 555 | CURRENT_PROJECT_VERSION = 27; | |
| 580 | 556 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 581 | 557 | ENABLE_PREVIEWS = YES; |
| 582 | 558 | GENERATE_INFOPLIST_FILE = YES; |
| @@ -593,7 +569,7 @@ | ||
| 593 | 569 | "$(inherited)", |
| 594 | 570 | "@executable_path/Frameworks", |
| 595 | 571 | ); |
| 596 | MARKETING_VERSION = 2.10.2; | |
| 572 | MARKETING_VERSION = 2.10.3; | |
| 597 | 573 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch; |
| 598 | 574 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 599 | 575 | STRING_CATALOG_GENERATE_SYMBOLS = YES; |
| @@ -656,7 +632,7 @@ | ||
| 656 | 632 | APPLICATION_EXTENSION_API_ONLY = YES; |
| 657 | 633 | CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements; |
| 658 | 634 | CODE_SIGN_STYLE = Automatic; |
| 659 | CURRENT_PROJECT_VERSION = 26; | |
| 635 | CURRENT_PROJECT_VERSION = 27; | |
| 660 | 636 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 661 | 637 | GENERATE_INFOPLIST_FILE = NO; |
| 662 | 638 | INFOPLIST_FILE = HutchWidgetExtension/Info.plist; |
| @@ -666,7 +642,7 @@ | ||
| 666 | 642 | "@executable_path/Frameworks", |
| 667 | 643 | "@executable_path/../../Frameworks", |
| 668 | 644 | ); |
| 669 | MARKETING_VERSION = 2.10.2; | |
| 645 | MARKETING_VERSION = 2.10.3; | |
| 670 | 646 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension; |
| 671 | 647 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 672 | 648 | SKIP_INSTALL = YES; |
| @@ -685,7 +661,7 @@ | ||
| 685 | 661 | APPLICATION_EXTENSION_API_ONLY = YES; |
| 686 | 662 | CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements; |
| 687 | 663 | CODE_SIGN_STYLE = Automatic; |
| 688 | CURRENT_PROJECT_VERSION = 26; | |
| 664 | CURRENT_PROJECT_VERSION = 27; | |
| 689 | 665 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 690 | 666 | GENERATE_INFOPLIST_FILE = NO; |
| 691 | 667 | INFOPLIST_FILE = HutchWidgetExtension/Info.plist; |
| @@ -695,7 +671,7 @@ | ||
| 695 | 671 | "@executable_path/Frameworks", |
| 696 | 672 | "@executable_path/../../Frameworks", |
| 697 | 673 | ); |
| 698 | MARKETING_VERSION = 2.10.2; | |
| 674 | MARKETING_VERSION = 2.10.3; | |
| 699 | 675 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension; |
| 700 | 676 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 701 | 677 | SKIP_INSTALL = YES; |
Hutch/Views/Settings/SettingsView.swift +1 −1
| @@ -746,7 +746,7 @@ private struct AboutView: View { | ||
| 746 | 746 | .font(.subheadline) |
| 747 | 747 | .foregroundStyle(.secondary) |
| 748 | 748 | |
| 749 | Link(destination: URL(string: "https://hutch.cleberg.net/privacy.html")!) { | |
| 749 | Link(destination: URL(string: "https://zerolabs.sh/hutch/privacy-policy/")!) { | |
| 750 | 750 | SwiftUI.Label("Privacy Policy", systemImage: "hand.raised") |
| 751 | 751 | } |
| 752 | 752 | } |
website/index.html deleted −166
| @@ -1,166 +0,0 @@ | ||
| 1 | <!doctype html> | |
| 2 | <html lang="en"> | |
| 3 | ||
| 4 | <head> | |
| 5 | <meta charset="utf-8" /> | |
| 6 | <meta name="viewport" content="width=device-width, initial-scale=1" /> | |
| 7 | <title>Hutch — native SourceHut client for iOS</title> | |
| 8 | <meta name="description" | |
| 9 | content="Hutch is a native iOS client for SourceHut with support for repositories, builds, tickets, mailing lists, projects, and more." /> | |
| 10 | <link rel="stylesheet" href="styles.css" /> | |
| 11 | </head> | |
| 12 | ||
| 13 | <body> | |
| 14 | <div class="page"> | |
| 15 | <header class="site-header"> | |
| 16 | <div class="brand-row"> | |
| 17 | <a class="brand" href="index.html"> | |
| 18 | <img class="app-icon" src="https://img.cleberg.net/apps/hutch/logo/hutch_light.png" alt="Hutch icon" /> | |
| 19 | <div> | |
| 20 | <h1>Hutch</h1> | |
| 21 | <p class="subtitle">A native SourceHut client for iOS</p> | |
| 22 | </div> | |
| 23 | </a> | |
| 24 | ||
| 25 | <div class="hero-actions"> | |
| 26 | <a href="https://apps.apple.com/us/app/hutch-for-sourcehut/id6760742299" class="store-link" | |
| 27 | aria-label="Download Hutch on the App Store"> | |
| 28 | <img src="storebutton.svg" class="store-img" alt="Download on the App Store" /> | |
| 29 | </a> | |
| 30 | ||
| 31 | <nav class="header-links" aria-label="Hutch links"> | |
| 32 | <a href="https://sr.ht/~ccleberg/Hutch/">Source Code</a> | |
| 33 | <span>·</span> | |
| 34 | <a href="mailto:hello@cleberg.net">Email</a> | |
| 35 | </nav> | |
| 36 | </div> | |
| 37 | </div> | |
| 38 | ||
| 39 | <div class="intro-copy"> | |
| 40 | <p class="lede">SourceHut workflows, built for mobile.</p> | |
| 41 | <p>Hutch is a fast, native iOS app for working with SourceHut when you are away from your desk. It focuses on | |
| 42 | the things that matter on mobile: triaging work, reviewing patches, monitoring builds, following discussions, | |
| 43 | and managing repositories and tickets without a browser.</p> | |
| 44 | </div> | |
| 45 | </header> | |
| 46 | ||
| 47 | <main> | |
| 48 | <div class="info-banner info-banner-live"> | |
| 49 | Hutch is now available on the App Store for iPhone. | |
| 50 | <a href="https://apps.apple.com/us/app/hutch-for-sourcehut/id6760742299">Download Hutch for SourceHut</a>. | |
| 51 | </div> | |
| 52 | <section class="content-grid"> | |
| 53 | <div> | |
| 54 | <h2>Why it exists</h2> | |
| 55 | <p>SourceHut is intentionally simple, efficient, and workflow-focused. Hutch brings that same philosophy to | |
| 56 | iOS with an interface designed for quick decisions and real work on the go.</p> | |
| 57 | <p>Instead of treating mobile as a stripped-down viewer, Hutch is meant to be a practical client for reading, | |
| 58 | responding, creating, and managing work across the SourceHut ecosystem.</p> | |
| 59 | </div> | |
| 60 | ||
| 61 | <div> | |
| 62 | <h2>What it does</h2> | |
| 63 | <ul class="feature-list"> | |
| 64 | <li>Review patch threads and browse mailing lists</li> | |
| 65 | <li>Manage trackers, tickets, assignees, labels, and comments</li> | |
| 66 | <li>Browse Git and Mercurial repositories, files, refs, commits, and diffs</li> | |
| 67 | <li>Submit, monitor, retry, and inspect builds and logs</li> | |
| 68 | <li>Follow projects linking repositories, trackers, and lists</li> | |
| 69 | <li>Manage profile settings, SSH keys, PGP keys, and access tokens</li> | |
| 70 | </ul> | |
| 71 | </div> | |
| 72 | </section> | |
| 73 | ||
| 74 | <section class="screenshots"> | |
| 75 | <h2>Interface</h2> | |
| 76 | <p class="section-intro">From patch review to trackers, builds, repositories, and project organization, Hutch is | |
| 77 | built to make SourceHut feel at home on iOS.</p> | |
| 78 | <div class="shot-scroll" aria-label="Hutch screenshots"> | |
| 79 | <figure class="shot-card"> | |
| 80 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/01_patch.jpg" alt="Patch review screenshot" | |
| 81 | loading="lazy" /> | |
| 82 | <figcaption>Review patches anywhere</figcaption> | |
| 83 | </figure> | |
| 84 | <figure class="shot-card"> | |
| 85 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/02_thread.jpg" alt="Threaded inbox screenshot" | |
| 86 | loading="lazy" /> | |
| 87 | <figcaption>Stay on top of discussions</figcaption> | |
| 88 | </figure> | |
| 89 | <figure class="shot-card"> | |
| 90 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/03_builds.jpg" alt="Builds screenshot" | |
| 91 | loading="lazy" /> | |
| 92 | <figcaption>Monitor builds in real time</figcaption> | |
| 93 | </figure> | |
| 94 | <figure class="shot-card"> | |
| 95 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/04_tickets.jpg" alt="Tickets screenshot" | |
| 96 | loading="lazy" /> | |
| 97 | <figcaption>Manage issues on the go</figcaption> | |
| 98 | </figure> | |
| 99 | <figure class="shot-card"> | |
| 100 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/05_repo.jpg" alt="Repository diff screenshot" | |
| 101 | loading="lazy" /> | |
| 102 | <figcaption>Explore your code</figcaption> | |
| 103 | </figure> | |
| 104 | <figure class="shot-card"> | |
| 105 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/06_projects.jpg" alt="Projects screenshot" | |
| 106 | loading="lazy" /> | |
| 107 | <figcaption>Everything in one place</figcaption> | |
| 108 | </figure> | |
| 109 | <figure class="shot-card"> | |
| 110 | <img src="https://img.cleberg.net/apps/hutch/screenshots/iphone/07_actions.jpg" | |
| 111 | alt="Build submission screenshot" loading="lazy" /> | |
| 112 | <figcaption>Take action instantly</figcaption> | |
| 113 | </figure> | |
| 114 | </div> | |
| 115 | </section> | |
| 116 | ||
| 117 | <section class="feature-sections"> | |
| 118 | <div class="feature-panel"> | |
| 119 | <h2>Major features</h2> | |
| 120 | <ul class="feature-list"> | |
| 121 | <li>Home dashboard with projects, assigned tickets, recent builds, and inbox shortcuts</li> | |
| 122 | <li>Unread-first inbox with thread detail, patch rendering, and reply via Apple Mail</li> | |
| 123 | <li>Git and Mercurial repository browsing, settings, ACLs, and creation flows</li> | |
| 124 | <li>Tracker and ticket workflows including comments, assignees, resolutions, and labels</li> | |
| 125 | <li>Build submission, build history, log viewing, cancellation, and rebuild flows</li> | |
| 126 | <li>Project views linking repositories, trackers, and mailing lists into one hub</li> | |
| 127 | </ul> | |
| 128 | </div> | |
| 129 | ||
| 130 | <div class="feature-panel"> | |
| 131 | <h2>Built for SourceHut users</h2> | |
| 132 | <ul class="feature-list"> | |
| 133 | <li>Native Swift interface with no analytics, ads, or tracking SDKs</li> | |
| 134 | <li>Deep links for repositories, tickets, and builds via <code>hutch://</code></li> | |
| 135 | <li>Share actions across repositories, files, commits, tickets, builds, and profiles</li> | |
| 136 | <li>Pull-to-refresh, loading states, empty states, and error overlays across major screens</li> | |
| 137 | <li>Keychain-backed authentication with secure SourceHut personal access tokens</li> | |
| 138 | <li>Profile management including avatars, SSH keys, PGP keys, and token/grant viewing</li> | |
| 139 | </ul> | |
| 140 | </div> | |
| 141 | </section> | |
| 142 | ||
| 143 | <section class="resources"> | |
| 144 | <h2>Resources</h2> | |
| 145 | <ul class="resource-list"> | |
| 146 | <li><a href="https://apps.apple.com/us/app/hutch-for-sourcehut/id6760742299">Download on the App Store</a></li> | |
| 147 | <li><a href="https://sr.ht/~ccleberg/Hutch/">Project homepage</a></li> | |
| 148 | <li><a href="https://todo.sr.ht/~ccleberg/Hutch/">Issue tracker</a></li> | |
| 149 | <li>Mailing Lists: | |
| 150 | <ul> | |
| 151 | <li><a href="https://lists.sr.ht/~ccleberg/hutch-devel">hutch-devel</a></li> | |
| 152 | <li><a href="https://lists.sr.ht/~ccleberg/hutch-announce">hutch-announce</a></li> | |
| 153 | </ul> | |
| 154 | </li> | |
| 155 | <li><a href="privacy.html">Privacy policy</a></li> | |
| 156 | </ul> | |
| 157 | </section> | |
| 158 | </main> | |
| 159 | ||
| 160 | <footer class="site-footer"> | |
| 161 | © 2026 <a href="https://cleberg.net">Christian Cleberg</a> | |
| 162 | </footer> | |
| 163 | </div> | |
| 164 | </body> | |
| 165 | ||
| 166 | </html> | |
website/privacy.html deleted −130
| @@ -1,130 +0,0 @@ | ||
| 1 | <!doctype html> | |
| 2 | <html lang="en"> | |
| 3 | ||
| 4 | <head> | |
| 5 | <meta charset="utf-8" /> | |
| 6 | <meta name="viewport" content="width=device-width, initial-scale=1" /> | |
| 7 | <title>Privacy Policy — Hutch</title> | |
| 8 | <link rel="stylesheet" href="styles.css" /> | |
| 9 | </head> | |
| 10 | ||
| 11 | <body> | |
| 12 | <div class="page"> | |
| 13 | <header class="site-header"> | |
| 14 | <div class="brand-row"> | |
| 15 | <a class="brand" href="index.html"> | |
| 16 | <img class="app-icon" src="https://img.cleberg.net/apps/hutch/logo/hutch_light.png" | |
| 17 | alt="Hutch icon" /> | |
| 18 | <div> | |
| 19 | <h1>Hutch</h1> | |
| 20 | <p class="subtitle">A native SourceHut client for iPhone</p> | |
| 21 | </div> | |
| 22 | </a> | |
| 23 | ||
| 24 | <div class="hero-actions"> | |
| 25 | <a href="https://apps.apple.com/us/app/hutch-for-sourcehut/id6760742299" class="store-link" | |
| 26 | aria-label="Download Hutch on the App Store"> | |
| 27 | <img src="storebutton.svg" class="store-img" alt="Download on the App Store" /> | |
| 28 | </a> | |
| 29 | ||
| 30 | <nav class="header-links"> | |
| 31 | <a href="https://sr.ht/~ccleberg/Hutch/">Source Code</a> | |
| 32 | <span>·</span> | |
| 33 | <a href="mailto:hello@cleberg.net">Email</a> | |
| 34 | </nav> | |
| 35 | </div> | |
| 36 | </div> | |
| 37 | </header> | |
| 38 | ||
| 39 | <main> | |
| 40 | <section class="privacy"> | |
| 41 | <h2>Privacy Policy</h2> | |
| 42 | ||
| 43 | <p><strong>Hutch</strong><br> | |
| 44 | Last updated: March 20, 2026</p> | |
| 45 | ||
| 46 | <h3>Overview</h3> | |
| 47 | <p> | |
| 48 | Hutch is a native client for SourceHut on iPhone. It lets users work with repositories, | |
| 49 | projects, mailing lists, tickets, and builds using their own SourceHut account. | |
| 50 | </p> | |
| 51 | ||
| 52 | <h3>Data Collection</h3> | |
| 53 | <p> | |
| 54 | Hutch does not collect, store, or transmit personal data to the developer. | |
| 55 | </p> | |
| 56 | <p> | |
| 57 | All data shown in the app is retrieved directly from SourceHut using credentials provided by the | |
| 58 | user. | |
| 59 | </p> | |
| 60 | ||
| 61 | <h3>Authentication</h3> | |
| 62 | <p> | |
| 63 | Hutch uses a SourceHut Personal Access Token (PAT) provided by the user. | |
| 64 | </p> | |
| 65 | <p> | |
| 66 | The token is stored securely on-device using iOS secure storage and is used only to authenticate | |
| 67 | requests | |
| 68 | to SourceHut. The developer does not have access to this token. | |
| 69 | </p> | |
| 70 | ||
| 71 | <h3>Data Usage</h3> | |
| 72 | <p>The app communicates with SourceHut servers to:</p> | |
| 73 | <ul> | |
| 74 | <li>fetch repositories, files, commits, and project metadata</li> | |
| 75 | <li>retrieve and update trackers, tickets, labels, and comments</li> | |
| 76 | <li>read mailing lists, inbox threads, and patch discussions</li> | |
| 77 | <li>submit, inspect, cancel, and rebuild build jobs</li> | |
| 78 | <li>manage profile data, avatars, SSH keys, PGP keys, and access tokens</li> | |
| 79 | </ul> | |
| 80 | <p> | |
| 81 | No data is transmitted to any servers operated by the developer. | |
| 82 | </p> | |
| 83 | ||
| 84 | <h3>Third-Party Services</h3> | |
| 85 | <p> | |
| 86 | Hutch communicates with SourceHut services (sr.ht) to retrieve and update user data. | |
| 87 | </p> | |
| 88 | <p> | |
| 89 | When replying to mailing list threads, Hutch can hand the message off to Apple Mail using the iOS | |
| 90 | Mail composer. | |
| 91 | </p> | |
| 92 | <p> | |
| 93 | No analytics, advertising, or tracking SDKs are used. | |
| 94 | </p> | |
| 95 | ||
| 96 | <h3>User-Generated Content</h3> | |
| 97 | <p> | |
| 98 | Hutch displays and edits content from SourceHut, including repositories, tickets, mailing list | |
| 99 | threads, | |
| 100 | and builds. This content is accessed based on the user’s authentication and permissions. | |
| 101 | </p> | |
| 102 | ||
| 103 | <h3>Device Permissions</h3> | |
| 104 | <p> | |
| 105 | Hutch may request access to Photos when the user chooses to upload a profile avatar. | |
| 106 | </p> | |
| 107 | <p> | |
| 108 | Hutch does not request access to location, contacts, camera, or microphone. | |
| 109 | </p> | |
| 110 | ||
| 111 | <h3>Changes to This Policy</h3> | |
| 112 | <p> | |
| 113 | This policy may be updated in future versions. Updates will be reflected on this page. | |
| 114 | </p> | |
| 115 | ||
| 116 | <h3>Contact</h3> | |
| 117 | <p> | |
| 118 | For questions, contact: | |
| 119 | <a href="mailto:privacy@cleberg.net">privacy@cleberg.net</a> | |
| 120 | </p> | |
| 121 | </section> | |
| 122 | </main> | |
| 123 | ||
| 124 | <footer class="site-footer"> | |
| 125 | © 2026 <a href="https://cleberg.net">Christian Cleberg</a> | |
| 126 | </footer> | |
| 127 | </div> | |
| 128 | </body> | |
| 129 | ||
| 130 | </html> | |
website/storebutton.svg deleted −46
| @@ -1,46 +0,0 @@ | ||
| 1 | <svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40"> | |
| 2 | <title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title> | |
| 3 | <g> | |
| 4 | <g> | |
| 5 | <g> | |
| 6 | <path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/> | |
| 7 | <path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/> | |
| 8 | </g> | |
| 9 | <g id="_Group_" data-name="<Group>"> | |
| 10 | <g id="_Group_2" data-name="<Group>"> | |
| 11 | <g id="_Group_3" data-name="<Group>"> | |
| 12 | <path id="_Path_" data-name="<Path>" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/> | |
| 13 | <path id="_Path_2" data-name="<Path>" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/> | |
| 14 | </g> | |
| 15 | </g> | |
| 16 | <g> | |
| 17 | <path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/> | |
| 18 | <path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/> | |
| 19 | <path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/> | |
| 20 | <path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/> | |
| 21 | <path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/> | |
| 22 | <path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/> | |
| 23 | <path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/> | |
| 24 | <path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/> | |
| 25 | </g> | |
| 26 | </g> | |
| 27 | </g> | |
| 28 | <g id="_Group_4" data-name="<Group>"> | |
| 29 | <g> | |
| 30 | <path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/> | |
| 31 | <path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/> | |
| 32 | <path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/> | |
| 33 | <path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/> | |
| 34 | <path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/> | |
| 35 | <path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/> | |
| 36 | <path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/> | |
| 37 | <path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/> | |
| 38 | <path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/> | |
| 39 | <path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/> | |
| 40 | <path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/> | |
| 41 | <path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/> | |
| 42 | <path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/> | |
| 43 | </g> | |
| 44 | </g> | |
| 45 | </g> | |
| 46 | </svg> | |
website/styles.css deleted −320
| @@ -1,320 +0,0 @@ | ||
| 1 | :root { | |
| 2 | --bg: #f3f3f1; | |
| 3 | --surface: #fff; | |
| 4 | --border: #ddd; | |
| 5 | --text: #111; | |
| 6 | --muted: rgba(0, 0, 0, 0.62); | |
| 7 | --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06); | |
| 8 | --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.06); | |
| 9 | } | |
| 10 | ||
| 11 | * { | |
| 12 | box-sizing: border-box; | |
| 13 | } | |
| 14 | ||
| 15 | body { | |
| 16 | font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; | |
| 17 | background: var(--bg); | |
| 18 | color: var(--text); | |
| 19 | margin: 0; | |
| 20 | } | |
| 21 | ||
| 22 | a, | |
| 23 | a:visited { | |
| 24 | color: blue; | |
| 25 | } | |
| 26 | ||
| 27 | img { | |
| 28 | max-width: 100%; | |
| 29 | display: block; | |
| 30 | } | |
| 31 | ||
| 32 | .page { | |
| 33 | max-width: 960px; | |
| 34 | margin: 0 auto; | |
| 35 | padding: 16px; | |
| 36 | } | |
| 37 | ||
| 38 | .privacy, | |
| 39 | .site-header, | |
| 40 | .content-grid, | |
| 41 | .screenshots, | |
| 42 | .resources, | |
| 43 | .feature-sections { | |
| 44 | border: 1px solid var(--border); | |
| 45 | background: var(--surface); | |
| 46 | margin-bottom: 16px; | |
| 47 | padding: 20px; | |
| 48 | } | |
| 49 | ||
| 50 | .brand-row { | |
| 51 | display: flex; | |
| 52 | justify-content: space-between; | |
| 53 | gap: 20px; | |
| 54 | align-items: flex-start; | |
| 55 | } | |
| 56 | ||
| 57 | .brand, | |
| 58 | .brand h1, | |
| 59 | .brand p { | |
| 60 | color: black; | |
| 61 | text-decoration: none; | |
| 62 | } | |
| 63 | ||
| 64 | .brand { | |
| 65 | display: flex; | |
| 66 | gap: 16px; | |
| 67 | align-items: center; | |
| 68 | min-width: 0; | |
| 69 | } | |
| 70 | ||
| 71 | .brand h1 { | |
| 72 | margin: 0; | |
| 73 | } | |
| 74 | ||
| 75 | .subtitle, | |
| 76 | .brand p { | |
| 77 | margin-top: 0; | |
| 78 | opacity: 0.68; | |
| 79 | } | |
| 80 | ||
| 81 | .app-icon { | |
| 82 | width: 80px; | |
| 83 | border-radius: 18px; | |
| 84 | border: 1px solid rgba(0, 0, 0, 0.08); | |
| 85 | box-shadow: var(--shadow-sm), 0 4px 12px rgba(0, 0, 0, 0.08); | |
| 86 | flex: 0 0 auto; | |
| 87 | } | |
| 88 | ||
| 89 | .hero-actions { | |
| 90 | text-align: right; | |
| 91 | flex: 0 0 auto; | |
| 92 | } | |
| 93 | ||
| 94 | .store-img { | |
| 95 | height: 40px; | |
| 96 | padding-bottom: 0.5rem; | |
| 97 | } | |
| 98 | ||
| 99 | .header-links { | |
| 100 | font-size: 14px; | |
| 101 | } | |
| 102 | ||
| 103 | .intro-copy { | |
| 104 | margin-top: 18px; | |
| 105 | } | |
| 106 | ||
| 107 | .lede { | |
| 108 | margin: 0 0 10px; | |
| 109 | font-weight: 700; | |
| 110 | font-size: 1.125rem; | |
| 111 | } | |
| 112 | ||
| 113 | .intro-copy p:last-child { | |
| 114 | margin-bottom: 0; | |
| 115 | } | |
| 116 | ||
| 117 | .content-grid, | |
| 118 | .feature-sections { | |
| 119 | display: grid; | |
| 120 | grid-template-columns: 1fr 1fr; | |
| 121 | gap: 20px; | |
| 122 | } | |
| 123 | ||
| 124 | .content-grid>div, | |
| 125 | .feature-sections>.feature-panel { | |
| 126 | min-width: 0; | |
| 127 | } | |
| 128 | ||
| 129 | .content-grid h2, | |
| 130 | .screenshots h2, | |
| 131 | .resources h2, | |
| 132 | .feature-panel h2 { | |
| 133 | margin-top: 0; | |
| 134 | } | |
| 135 | ||
| 136 | .feature-list { | |
| 137 | margin: 0; | |
| 138 | padding-left: 1.2rem; | |
| 139 | line-height: 1.55; | |
| 140 | } | |
| 141 | ||
| 142 | .feature-list li+li { | |
| 143 | margin-top: 0.45rem; | |
| 144 | } | |
| 145 | ||
| 146 | .section-intro { | |
| 147 | margin-top: 0; | |
| 148 | color: var(--muted); | |
| 149 | } | |
| 150 | ||
| 151 | .shot-scroll { | |
| 152 | display: grid; | |
| 153 | grid-auto-flow: column; | |
| 154 | grid-auto-columns: minmax(220px, 280px); | |
| 155 | gap: 12px; | |
| 156 | overflow-x: auto; | |
| 157 | overscroll-behavior-x: contain; | |
| 158 | padding-bottom: 8px; | |
| 159 | scroll-snap-type: x proximity; | |
| 160 | -webkit-overflow-scrolling: touch; | |
| 161 | } | |
| 162 | ||
| 163 | .shot-scroll::-webkit-scrollbar { | |
| 164 | height: 10px; | |
| 165 | } | |
| 166 | ||
| 167 | .shot-scroll::-webkit-scrollbar-thumb { | |
| 168 | background: rgba(0, 0, 0, 0.18); | |
| 169 | } | |
| 170 | ||
| 171 | .shot-card { | |
| 172 | margin: 0; | |
| 173 | scroll-snap-align: start; | |
| 174 | border: 1px solid var(--border); | |
| 175 | overflow: hidden; | |
| 176 | background: #fafafa; | |
| 177 | box-shadow: var(--shadow-md); | |
| 178 | } | |
| 179 | ||
| 180 | .shot-card img { | |
| 181 | width: 100%; | |
| 182 | height: auto; | |
| 183 | } | |
| 184 | ||
| 185 | .shot-card figcaption { | |
| 186 | padding: 10px 12px 12px; | |
| 187 | font-size: 0.95rem; | |
| 188 | font-weight: 600; | |
| 189 | } | |
| 190 | ||
| 191 | .resource-list { | |
| 192 | display: flex; | |
| 193 | flex-direction: column; | |
| 194 | gap: 6px; | |
| 195 | margin: 0; | |
| 196 | padding-left: 1.2rem; | |
| 197 | } | |
| 198 | ||
| 199 | .resource-list ul { | |
| 200 | margin-top: 6px; | |
| 201 | } | |
| 202 | ||
| 203 | .site-footer, | |
| 204 | footer { | |
| 205 | padding: 4px 2px 24px; | |
| 206 | } | |
| 207 | ||
| 208 | .privacy h2 { | |
| 209 | margin: 0 0 20px; | |
| 210 | font-size: 28px; | |
| 211 | line-height: 1.1; | |
| 212 | } | |
| 213 | ||
| 214 | .privacy h3 { | |
| 215 | margin: 24px 0 8px; | |
| 216 | font-size: 18px; | |
| 217 | line-height: 1.2; | |
| 218 | } | |
| 219 | ||
| 220 | .privacy p { | |
| 221 | margin: 0 0 14px; | |
| 222 | line-height: 1.5; | |
| 223 | } | |
| 224 | ||
| 225 | .privacy ul { | |
| 226 | margin: 0 0 14px; | |
| 227 | padding-left: 0; | |
| 228 | list-style: none; | |
| 229 | } | |
| 230 | ||
| 231 | .privacy li { | |
| 232 | padding-left: 1em; | |
| 233 | text-indent: -1em; | |
| 234 | } | |
| 235 | ||
| 236 | .privacy li::before { | |
| 237 | content: "- "; | |
| 238 | } | |
| 239 | ||
| 240 | .privacy a:hover { | |
| 241 | text-decoration: underline; | |
| 242 | } | |
| 243 | ||
| 244 | code { | |
| 245 | font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; | |
| 246 | font-size: 0.95em; | |
| 247 | } | |
| 248 | ||
| 249 | @media (max-width: 760px) { | |
| 250 | .page { | |
| 251 | padding: 12px; | |
| 252 | } | |
| 253 | ||
| 254 | .brand-row, | |
| 255 | .content-grid, | |
| 256 | .feature-sections { | |
| 257 | grid-template-columns: 1fr; | |
| 258 | display: grid; | |
| 259 | } | |
| 260 | ||
| 261 | .shot-scroll { | |
| 262 | grid-auto-columns: minmax(240px, 78vw); | |
| 263 | } | |
| 264 | ||
| 265 | .brand-row { | |
| 266 | gap: 16px; | |
| 267 | } | |
| 268 | ||
| 269 | .hero-actions { | |
| 270 | text-align: left; | |
| 271 | } | |
| 272 | ||
| 273 | .brand { | |
| 274 | align-items: flex-start; | |
| 275 | } | |
| 276 | ||
| 277 | .store-img { | |
| 278 | height: 44px; | |
| 279 | } | |
| 280 | ||
| 281 | .content-grid, | |
| 282 | .feature-sections { | |
| 283 | gap: 12px; | |
| 284 | } | |
| 285 | ||
| 286 | .site-header, | |
| 287 | .content-grid, | |
| 288 | .screenshots, | |
| 289 | .resources, | |
| 290 | .feature-sections, | |
| 291 | .privacy { | |
| 292 | padding: 16px; | |
| 293 | } | |
| 294 | ||
| 295 | .feature-list, | |
| 296 | .resource-list { | |
| 297 | padding-left: 1.1rem; | |
| 298 | } | |
| 299 | } | |
| 300 | ||
| 301 | .info-banner { | |
| 302 | margin: 24px auto; | |
| 303 | padding: 14px 16px; | |
| 304 | max-width: 960px; | |
| 305 | ||
| 306 | background: #fff3cd; | |
| 307 | border: 1px solid #ffeeba; | |
| 308 | ||
| 309 | color: #856404; | |
| 310 | font-size: 14px; | |
| 311 | line-height: 1.5; | |
| 312 | ||
| 313 | text-align: center; | |
| 314 | } | |
| 315 | ||
| 316 | .info-banner-live { | |
| 317 | background: #edf7ee; | |
| 318 | border-color: #cfe8d3; | |
| 319 | color: #1d5c2f; | |
| 320 | } | |