summaryrefslogtreecommitdiff
path: root/website
diff options
context:
space:
mode:
Diffstat (limited to 'website')
-rw-r--r--website/index.html111
-rw-r--r--website/privacy.html45
-rw-r--r--website/styles.css216
3 files changed, 311 insertions, 61 deletions
diff --git a/website/index.html b/website/index.html
index fb711e2..296f803 100644
--- a/website/index.html
+++ b/website/index.html
@@ -4,7 +4,9 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>Hutch — native sourcehut client for iPhone</title>
+ <title>Hutch — native SourceHut client for iOS</title>
+ <meta name="description"
+ content="Hutch is a native iOS client for SourceHut with support for repositories, builds, tickets, mailing lists, projects, and more." />
<link rel="stylesheet" href="styles.css" />
</head>
@@ -16,51 +18,124 @@
<img class="app-icon" src="https://img.cleberg.net/apps/hutch/logo/hutch_light.png" alt="Hutch icon" />
<div>
<h1>Hutch</h1>
- <p class="subtitle">A native sourcehut client for iPhone</p>
+ <p class="subtitle">A native SourceHut client for iOS</p>
</div>
</a>
<div class="hero-actions">
- <a href="#" class="store-link">
+ <a href="#" class="store-link" aria-label="Download Hutch on the App Store">
<img src="storebutton.svg" class="store-img" alt="Download on the App Store" />
</a>
- <nav class="header-links">
+ <nav class="header-links" aria-label="Hutch links">
<a href="https://sr.ht/~ccleberg/Hutch/">Source Code</a>
<span>·</span>
<a href="mailto:[email protected]">Email</a>
</nav>
</div>
</div>
+
+ <div class="intro-copy">
+ <p class="lede">SourceHut workflows, built for mobile.</p>
+ <p>Hutch is a fast, native iOS app for working with SourceHut when you are away from your desk. It focuses on
+ the things that matter on mobile: triaging work, reviewing patches, monitoring builds, following discussions,
+ and managing repositories and tickets without a browser.</p>
+ </div>
</header>
<main>
+ <div class="info-banner">
+ Hutch is currently under review by Apple and not yet available for download.
+ This page will be updated with the App Store link once approved.
+ </div>
<section class="content-grid">
<div>
<h2>Why it exists</h2>
- <p>Built for people who prefer simple tools, plain text, and fast workflows.</p>
- <p>Sourcehut is popular because of its simplicity and effectiveness, and I wanted an app that inherited those
- traits.</p>
+ <p>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.</p>
+ <p>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.</p>
</div>
<div>
<h2>What it does</h2>
- <ul>
- <li>Browse repositories</li>
- <li>Monitor builds and logs</li>
- <li>Manage trackers and tickets</li>
- <li>Git + Mercurial support</li>
- <li>Profile & key management</li>
+ <ul class="feature-list">
+ <li>Review patch threads and browse mailing lists</li>
+ <li>Manage trackers, tickets, assignees, labels, and comments</li>
+ <li>Browse Git and Mercurial repositories, files, refs, commits, and diffs</li>
+ <li>Submit, monitor, retry, and inspect builds and logs</li>
+ <li>Follow projects linking repositories, trackers, and lists</li>
+ <li>Manage profile settings, SSH keys, PGP keys, and access tokens</li>
</ul>
</div>
</section>
<section class="screenshots">
<h2>Interface</h2>
- <div class="shot-grid">
- <img src="https://img.cleberg.net/apps/hutch/screenshots/code.webp">
- <img src="https://img.cleberg.net/apps/hutch/screenshots/builds.webp">
- <img src="https://img.cleberg.net/apps/hutch/screenshots/todo.webp">
+ <p class="section-intro">From patch review to trackers, builds, repositories, and project organization, Hutch is
+ built to make SourceHut feel at home on iOS.</p>
+ <div class="shot-scroll" aria-label="Hutch screenshots">
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/01_patch.jpg" alt="Patch review screenshot"
+ loading="lazy" />
+ <figcaption>Review patches anywhere</figcaption>
+ </figure>
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/02_thread.jpg" alt="Threaded inbox screenshot"
+ loading="lazy" />
+ <figcaption>Stay on top of discussions</figcaption>
+ </figure>
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/03_builds.jpg" alt="Builds screenshot"
+ loading="lazy" />
+ <figcaption>Monitor builds in real time</figcaption>
+ </figure>
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/04_tickets.jpg" alt="Tickets screenshot"
+ loading="lazy" />
+ <figcaption>Manage issues on the go</figcaption>
+ </figure>
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/05_repo.jpg" alt="Repository diff screenshot"
+ loading="lazy" />
+ <figcaption>Explore your code</figcaption>
+ </figure>
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/06_projects.jpg" alt="Projects screenshot"
+ loading="lazy" />
+ <figcaption>Everything in one place</figcaption>
+ </figure>
+ <figure class="shot-card">
+ <img src="https://img.cleberg.net/apps/hutch/screenshots/iOS/07_actions.jpg"
+ alt="Build submission screenshot" loading="lazy" />
+ <figcaption>Take action instantly</figcaption>
+ </figure>
+ </div>
+ </section>
+
+ <section class="feature-sections">
+ <div class="feature-panel">
+ <h2>Major features</h2>
+ <ul class="feature-list">
+ <li>Home dashboard with projects, assigned tickets, recent builds, and inbox shortcuts</li>
+ <li>Unread-first inbox with thread detail, patch rendering, and reply via Apple Mail</li>
+ <li>Git and Mercurial repository browsing, settings, ACLs, and creation flows</li>
+ <li>Tracker and ticket workflows including comments, assignees, resolutions, and labels</li>
+ <li>Build submission, build history, log viewing, cancellation, and rebuild flows</li>
+ <li>Project views linking repositories, trackers, and mailing lists into one hub</li>
+ </ul>
+ </div>
+
+ <div class="feature-panel">
+ <h2>Built for SourceHut users</h2>
+ <ul class="feature-list">
+ <li>Native Swift interface with no analytics, ads, or tracking SDKs</li>
+ <li>Deep links for repositories, tickets, and builds via <code>hutch://</code></li>
+ <li>Share actions across repositories, files, commits, tickets, builds, and profiles</li>
+ <li>Pull-to-refresh, loading states, empty states, and error overlays across major screens</li>
+ <li>Keychain-backed authentication with secure SourceHut personal access tokens</li>
+ <li>Profile management including avatars, SSH keys, PGP keys, and token/grant viewing</li>
+ </ul>
</div>
</section>
@@ -80,7 +155,7 @@
</section>
</main>
- <footer>
+ <footer class="site-footer">
© 2026 <a href="https://cleberg.net">Christian Cleberg</a>
</footer>
</div>
diff --git a/website/privacy.html b/website/privacy.html
index cc7392e..5d50be4 100644
--- a/website/privacy.html
+++ b/website/privacy.html
@@ -17,12 +17,12 @@
alt="Hutch icon" />
<div>
<h1>Hutch</h1>
- <p class="subtitle">A native sourcehut client for iPhone</p>
+ <p class="subtitle">A native SourceHut client for iPhone</p>
</div>
</a>
<div class="hero-actions">
- <a href="#" class="store-link">
+ <a href="#" class="store-link" aria-label="Download Hutch on the App Store">
<img src="storebutton.svg" class="store-img" alt="Download on the App Store" />
</a>
@@ -40,12 +40,12 @@
<h2>Privacy Policy</h2>
<p><strong>Hutch</strong><br>
- Last updated: March 17, 2026</p>
+ Last updated: March 20, 2026</p>
<h3>Overview</h3>
<p>
- Hutch is a client for SourceHut. This app allows users to browse repositories,
- tickets, and builds using their own SourceHut account.
+ 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.
</p>
<h3>Data Collection</h3>
@@ -53,8 +53,8 @@
Hutch does not collect, store, or transmit personal data to the developer.
</p>
<p>
- All data displayed in the app is retrieved directly from SourceHut using
- user-provided authentication credentials.
+ All data shown in the app is retrieved directly from SourceHut using credentials provided by the
+ user.
</p>
<h3>Authentication</h3>
@@ -62,16 +62,19 @@
Hutch uses a SourceHut Personal Access Token (PAT) provided by the user.
</p>
<p>
- The token is stored securely on-device and is used only to authenticate requests
+ 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.
</p>
<h3>Data Usage</h3>
<p>The app communicates with SourceHut servers to:</p>
<ul>
- <li>fetch repositories, files, and commits</li>
- <li>retrieve and update tickets</li>
- <li>submit and monitor builds</li>
+ <li>fetch repositories, files, commits, and project metadata</li>
+ <li>retrieve and update trackers, tickets, labels, and comments</li>
+ <li>read mailing lists, inbox threads, and patch discussions</li>
+ <li>submit, inspect, cancel, and rebuild build jobs</li>
+ <li>manage profile data, avatars, SSH keys, PGP keys, and access tokens</li>
</ul>
<p>
No data is transmitted to any servers operated by the developer.
@@ -79,7 +82,11 @@
<h3>Third-Party Services</h3>
<p>
- Hutch communicates with SourceHut services (sr.ht) to retrieve user data.
+ Hutch communicates with SourceHut services (sr.ht) to retrieve and update user data.
+ </p>
+ <p>
+ When replying to mailing list threads, Hutch can hand the message off to Apple Mail using the iOS
+ Mail composer.
</p>
<p>
No analytics, advertising, or tracking SDKs are used.
@@ -87,15 +94,17 @@
<h3>User-Generated Content</h3>
<p>
- The app displays content from SourceHut, including repositories, tickets, and
- builds. This content is accessed based on the user’s authentication and
- permissions.
+ 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.
</p>
<h3>Device Permissions</h3>
<p>
- Hutch does not request access to sensitive device data such as location,
- contacts, camera, or microphone.
+ Hutch may request access to Photos when the user chooses to upload a profile avatar.
+ </p>
+ <p>
+ Hutch does not request access to location, contacts, camera, or microphone.
</p>
<h3>Changes to This Policy</h3>
@@ -112,7 +121,7 @@
</main>
<footer class="site-footer">
- © 2026 <a href="https://cleberg.net">Christian Cleberg</a>
+ © 2026 <a href="https://cleberg.net">Christian Cleberg</a>
</footer>
</div>
</body>
diff --git a/website/styles.css b/website/styles.css
index 0deb034..014e248 100644
--- a/website/styles.css
+++ b/website/styles.css
@@ -1,20 +1,36 @@
+: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;
- background: #f3f3f1;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ background: var(--bg);
+ color: var(--text);
margin: 0;
}
a,
a:visited {
- color: blue
+ color: blue;
}
img {
- max-width: 100%
+ max-width: 100%;
+ display: block;
}
.page {
- max-width: 900px;
+ max-width: 960px;
margin: 0 auto;
padding: 16px;
}
@@ -23,9 +39,10 @@ img {
.site-header,
.content-grid,
.screenshots,
-.resources {
- border: 1px solid #ddd;
- background: white;
+.resources,
+.feature-sections {
+ border: 1px solid var(--border);
+ background: var(--surface);
margin-bottom: 16px;
padding: 20px;
}
@@ -33,9 +50,13 @@ img {
.brand-row {
display: flex;
justify-content: space-between;
+ gap: 20px;
+ align-items: flex-start;
}
-.brand, .brand h1, .brand p {
+.brand,
+.brand h1,
+.brand p {
color: black;
text-decoration: none;
}
@@ -44,28 +65,30 @@ img {
display: flex;
gap: 16px;
align-items: center;
+ min-width: 0;
}
.brand h1 {
margin: 0;
}
+.subtitle,
.brand p {
margin-top: 0;
- opacity: 0.6;
+ opacity: 0.68;
}
.app-icon {
width: 80px;
border-radius: 18px;
border: 1px solid rgba(0, 0, 0, 0.08);
- box-shadow:
- 0 1px 2px rgba(0, 0, 0, 0.06),
- 0 4px 12px 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 {
@@ -78,37 +101,108 @@ img {
}
.intro-copy {
- margin-top: 16px;
+ margin-top: 18px;
}
.lede {
- padding-top: 1rem;
- font-weight: bold;
+ margin: 0 0 10px;
+ font-weight: 700;
+ font-size: 1.125rem;
+}
+
+.intro-copy p:last-child {
+ margin-bottom: 0;
}
-.content-grid {
+.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;
}
-.content-grid div:first-child {
- padding-right: 0.5rem;
+.feature-list {
+ margin: 0;
+ padding-left: 1.2rem;
+ line-height: 1.55;
+}
+
+.feature-list li+li {
+ margin-top: 0.45rem;
}
-.content-grid div:last-child {
- padding-left: 0.5rem;
+.section-intro {
+ margin-top: 0;
+ color: var(--muted);
}
-.shot-grid {
+.shot-scroll {
display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 10px;
+ 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 {
@@ -125,7 +219,7 @@ img {
.privacy p {
margin: 0 0 14px;
- line-height: 1.45;
+ line-height: 1.5;
}
.privacy ul {
@@ -145,4 +239,76 @@ img {
.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;
} \ No newline at end of file