Commit 62f7e07b7e
Unsigned
Layout: unified · split
ROADMAP.md +19 −76
| @@ -1,23 +1,5 @@ | |||
| 1 | # Hutch Roadmap | 1 | # Hutch Roadmap |
| 2 | 2 | ||
| 3 | ## Positioning | ||
| 4 | |||
| 5 | Hutch is already beyond a minimal v1. The core SourceHut surfaces are present: | ||
| 6 | |||
| 7 | - Authentication with PAT flow | ||
| 8 | - Git repositories | ||
| 9 | - Mercurial repositories | ||
| 10 | - Trackers and tickets | ||
| 11 | - Builds | ||
| 12 | - Sharing | ||
| 13 | - Core settings and app metadata | ||
| 14 | |||
| 15 | The main risk now is not lack of scope. The main risk is shipping too late with | ||
| 16 | an increasingly broad surface area and not enough polish. | ||
| 17 | |||
| 18 | This roadmap treats the current app as a real 1.0 candidate and shifts the | ||
| 19 | focus from feature expansion to launch readiness. | ||
| 20 | |||
| 21 | ## Version 1.0 Goal | 3 | ## Version 1.0 Goal |
| 22 | 4 | ||
| 23 | Ship a stable SourceHut mobile client with strong support for the most active | 5 | Ship a stable SourceHut mobile client with strong support for the most active |
| @@ -26,10 +8,12 @@ day-to-day workflows: | |||
| 26 | - Browse and manage repositories | 8 | - Browse and manage repositories |
| 27 | - Browse and manage tickets | 9 | - Browse and manage tickets |
| 28 | - Browse and manage builds | 10 | - Browse and manage builds |
| 29 | - Support both git and hg repositories | 11 | - Support both Git and Mercurial repositories |
| 30 | - Provide dependable sharing and navigation | 12 | - Provide dependable sharing and navigation |
| 31 | 13 | ||
| 32 | Version 1.0 does not need to cover every sr.ht service. | 14 | Version 1.0 does not need to cover every SourceHut service. |
| 15 | |||
| 16 | --- | ||
| 33 | 17 | ||
| 34 | ## Release Strategy | 18 | ## Release Strategy |
| 35 | 19 | ||
| @@ -50,25 +34,25 @@ Focus on quality, not new surface area. | |||
| 50 | - Build submission | 34 | - Build submission |
| 51 | - Verify build retry and edit/resubmit flows | 35 | - Verify build retry and edit/resubmit flows |
| 52 | - Verify repository sharing links for: | 36 | - Verify repository sharing links for: |
| 53 | - repository | 37 | - Repository |
| 54 | - commit | 38 | - Commit |
| 55 | - file | 39 | - File |
| 56 | - Verify sharing links for: | 40 | - Verify sharing links for: |
| 57 | - build | 41 | - Build |
| 58 | - tracker | 42 | - Tracker |
| 59 | - ticket | 43 | - Ticket |
| 60 | - profile | 44 | - Profile |
| 61 | - Review empty/loading/error states across all main tabs | 45 | - Review empty/loading/error states across all main tabs |
| 62 | - Remove any leftover temporary debug logging | 46 | - Remove any leftover temporary debug logging |
| 63 | - Audit device-only issues: | 47 | - Audit device-only issues: |
| 64 | - Xcode attach quirks | 48 | - Xcode attach quirks |
| 65 | - on-device auth/cache behavior | 49 | - On-device auth/cache behavior |
| 66 | - WebView rendering performance | 50 | - WebView rendering performance |
| 67 | 51 | ||
| 68 | #### UI/UX polish checklist | 52 | #### UI/UX polish checklist |
| 69 | 53 | ||
| 70 | - Tighten wording and error messages across create/edit flows | 54 | - Tighten wording and error messages across create/edit flows |
| 71 | - Confirm summary tabs feel consistent across git and hg | 55 | - Confirm summary tabs feel consistent across Git and Mercurial |
| 72 | - Confirm toolbar actions are visible and non-duplicated | 56 | - Confirm toolbar actions are visible and non-duplicated |
| 73 | - Confirm README rendering is smooth on large repositories | 57 | - Confirm README rendering is smooth on large repositories |
| 74 | - Confirm forms behave well on iPhone-sized screens | 58 | - Confirm forms behave well on iPhone-sized screens |
| @@ -82,6 +66,8 @@ Focus on quality, not new surface area. | |||
| 82 | - Finalize support URL / project URL | 66 | - Finalize support URL / project URL |
| 83 | - Decide whether TestFlight comes before public launch | 67 | - Decide whether TestFlight comes before public launch |
| 84 | 68 | ||
| 69 | --- | ||
| 70 | |||
| 85 | ### Phase 2: Version 1.1 | 71 | ### Phase 2: Version 1.1 |
| 86 | 72 | ||
| 87 | Add one compact new service surface after launch. | 73 | Add one compact new service surface after launch. |
| @@ -99,6 +85,8 @@ Add one compact new service surface after launch. | |||
| 99 | - paste.sr.ht is relatively self-contained | 85 | - paste.sr.ht is relatively self-contained |
| 100 | - lists.sr.ht is valuable, but broader in UI and data model scope | 86 | - lists.sr.ht is valuable, but broader in UI and data model scope |
| 101 | 87 | ||
| 88 | --- | ||
| 89 | |||
| 102 | ### Phase 3: Version 1.2+ | 90 | ### Phase 3: Version 1.2+ |
| 103 | 91 | ||
| 104 | Expand only after the v1 core is stable in the wild. | 92 | Expand only after the v1 core is stable in the wild. |
| @@ -106,50 +94,5 @@ Expand only after the v1 core is stable in the wild. | |||
| 106 | - lists.sr.ht tab | 94 | - lists.sr.ht tab |
| 107 | - paste.sr.ht creation/editing polish | 95 | - paste.sr.ht creation/editing polish |
| 108 | - pages.sr.ht management | 96 | - pages.sr.ht management |
| 109 | - broader deep-link/share coverage | 97 | - Broader deep-link/share coverage |
| 110 | - workflow refinements for builds and tickets | 98 | - Workflow refinements for builds and tickets |
| 111 | |||
| 112 | ## What Counts As “Done Enough” For 1.0 | ||
| 113 | |||
| 114 | Hutch is ready for 1.0 when: | ||
| 115 | |||
| 116 | - The main flows work reliably on real devices | ||
| 117 | - Errors are understandable | ||
| 118 | - The app does not feel inconsistent across git/hg/builds/tickets | ||
| 119 | - The missing services feel like roadmap items, not broken gaps | ||
| 120 | |||
| 121 | That means `lists.sr.ht`, `paste.sr.ht`, and `pages.sr.ht` are not blockers for | ||
| 122 | the first release. | ||
| 123 | |||
| 124 | ## Non-Blockers For 1.0 | ||
| 125 | |||
| 126 | These should not delay launch: | ||
| 127 | |||
| 128 | - Donation page / IAP | ||
| 129 | - Broad service parity across all SourceHut products | ||
| 130 | - Public repo discovery equivalent to `sr.ht/projects` | ||
| 131 | - Advanced creation workflows beyond what the public APIs cleanly support | ||
| 132 | |||
| 133 | ## Open Product Questions | ||
| 134 | |||
| 135 | These are worth deciding before or shortly after launch: | ||
| 136 | |||
| 137 | - Should the app be positioned as “SourceHut client” or “SourceHut for git/hg, | ||
| 138 | tickets, and builds” in App Store messaging? | ||
| 139 | - Should exact repository lookup live in Repositories search, a dedicated sheet, | ||
| 140 | or both? | ||
| 141 | - Should `paste.sr.ht` or `lists.sr.ht` be the first new post-launch tab? | ||
| 142 | - Is TestFlight feedback needed before calling the first public build 1.0? | ||
| 143 | |||
| 144 | ## Recommended Next Step | ||
| 145 | |||
| 146 | Do not add another major service right away. | ||
| 147 | |||
| 148 | Instead: | ||
| 149 | |||
| 150 | 1. Run a release-focused polish pass | ||
| 151 | 2. Build a strict 1.0 checklist from the current app | ||
| 152 | 3. Ship to TestFlight or release publicly | ||
| 153 | 4. Use `ROADMAP.md` and `TODO.md` separately: | ||
| 154 | - `ROADMAP.md` for release strategy | ||
| 155 | - `TODO.md` for concrete implementation backlog | ||
SECURITY.md +25 −25
| @@ -2,32 +2,32 @@ | |||
| 2 | 2 | ||
| 3 | ## Supported Versions | 3 | ## Supported Versions |
| 4 | 4 | ||
| 5 | This section outlines which versions of the project are currently receiving | 5 | |Version|Supported| |
| 6 | security updates. | 6 | |-------|---------| |
| 7 | | 1.x | ✅ Yes | | ||
| 8 | | < 1.0 | ❌ No | | ||
| 7 | 9 | ||
| 8 | | Version | Supported | | 10 | --- |
| 9 | | ------- | ------------------ | | ||
| 10 | | 1.x | :white_check_mark: | | ||
| 11 | | < 1.0 | :x: | | ||
| 12 | 11 | ||
| 13 | ## Reporting a Vulnerability | 12 | ## Reporting a Vulnerability |
| 14 | 13 | ||
| 15 | If you discover a vulnerability, please follow the guidelines below to report | 14 | If you discover a security vulnerability, **do not open a public issue**. |
| 16 | it: | 15 | Instead: |
| 17 | 16 | ||
| 18 | 1. **Submission**: Send your vulnerability report to [security@cleberg.net]. | 17 | 1. **Email** your report to [security@cleberg.net](mailto:security@cleberg.net). |
| 19 | Please include a detailed description of the issue, steps to reproduce it, | 18 | Include: |
| 20 | and any relevant context. | 19 | - A detailed description of the vulnerability |
| 21 | 20 | - Steps to reproduce | |
| 22 | 2. **Response Time**: We aim to acknowledge reports within **3 business days**. | 21 | - Any relevant context (e.g., affected versions, environment) |
| 23 | You will receive updates on the status of your report throughout the process. | 22 | 2. **Response Time**: We will acknowledge your report within **3 business days** |
| 24 | 23 | and keep you updated on the progress. | |
| 25 | 3. **Acceptance Criteria**: If the vulnerability is confirmed, we will provide | 24 | 3. **Resolution**: If confirmed, we will: |
| 26 | you with an estimated timeline for resolution and keep you informed of any | 25 | - Provide an estimated timeline for a fix |
| 27 | updates until the issue is resolved. | 26 | - Work with you to verify the resolution |
| 28 | 27 | - Credit you for the discovery (if you wish) | |
| 29 | 4. **Declined Reports**: If a reported vulnerability is deemed invalid or out of | 28 | 4. **Declined Reports**: If the report is invalid or out of scope, we will |
| 30 | scope, we will notify you of our decision and provide reasoning for the | 29 | explain why and close the issue. |
| 31 | decline. | 30 | |
| 32 | 31 | --- | |
| 33 | Thank you for helping us improve the security of our project! | 32 | |
| 33 | **Thank you for helping improve the security of our project!** | ||
TODO.md +60 −61
| @@ -1,68 +1,67 @@ | |||
| 1 | # Hutch TODO | 1 | # TODO |
| 2 | |||
| 3 | ## Claude Code, Codex, & Mistral Prompting Notes | ||
| 4 | |||
| 5 | - **Always start a new session with the project context block** (see | ||
| 6 | hutch-ios-prompts.md prompt 0) so the agent knows the API conventions. | ||
| 7 | - **Keep prompts short and specific.** Long prompts waste context. One bug or | ||
| 8 | feature per prompt. Paste console output and error messages directly instead | ||
| 9 | of describing them. | ||
| 10 | - **When a fix fails twice, ask the agent to print raw state first** (raw API | ||
| 11 | response, current file contents, exact variable values) before attempting | ||
| 12 | another fix. Blind retries consume context without progress. | ||
| 13 | - **Never paste full file contents into the prompt.** Ask the agent to read | ||
| 14 | the file itself using its file tools. | ||
| 15 | - **Batch only tightly related changes.** Unrelated changes in one prompt | ||
| 16 | increase the chance of partial failure and wasted context on rollback. | ||
| 17 | |||
| 18 | ## Features | ||
| 19 | |||
| 20 | - **Exact repository lookup**: Since public repository discovery/search is not | ||
| 21 | exposed in the public sr.ht API, add a manual `~owner/repo` lookup flow that | ||
| 22 | can open git.sr.ht or hg.sr.ht repositories directly. | ||
| 23 | |||
| 24 | - **paste.sr.ht tab**: Paste support. Endpoint: | ||
| 25 | https://paste.sr.ht/graphql. Show the authenticated user's pastes, allow | ||
| 26 | viewing individual pastes, and support creating new pastes. Required scope: | ||
| 27 | PASTES:RO for browsing, PASTES:RW for creation/editing. | ||
| 28 | |||
| 29 | - **lists.sr.ht tab**: Mailing list support. Endpoint: | ||
| 30 | https://lists.sr.ht/graphql. Show the authenticated user's mailing lists, | ||
| 31 | allow browsing email threads, and display individual emails as plain text. | ||
| 32 | Required scope: LISTS:RO. | ||
| 33 | |||
| 34 | - **pages.sr.ht tab**: Site management support. Endpoint: | ||
| 35 | https://pages.sr.ht/graphql. Show the authenticated user's published sites, | ||
| 36 | site metadata, publishing status, and access control where supported. This is | ||
| 37 | for managing Pages sites, not browsing public project discovery. | ||
| 38 | |||
| 39 | - **Donation page / IAP**: Add a donation/support page once the App Store / | ||
| 40 | StoreKit setup is ready. | ||
| 41 | 2 | ||
| 42 | ## Out of Scope | 3 | --- |
| 4 | |||
| 5 | ## TODO List | ||
| 6 | |||
| 7 | ### Core Functionality | ||
| 8 | |||
| 9 | - Implement manual `~owner/repo` lookup flow for opening git.sr.ht or hg.sr.ht | ||
| 10 | repositories directly | ||
| 11 | |||
| 12 | --- | ||
| 13 | |||
| 14 | ### paste.sr.ht | ||
| 15 | |||
| 16 | - **Endpoint:** [https://paste.sr.ht/graphql](https://paste.sr.ht/graphql) | ||
| 17 | - **Scope:** `PASTES:RO` (browsing), `PASTES:RW` (creation/editing) | ||
| 18 | |||
| 19 | **Tasks:** | ||
| 20 | |||
| 21 | - Show the authenticated user’s pastes | ||
| 22 | - Allow viewing individual pastes | ||
| 23 | - Support creating new pastes | ||
| 24 | |||
| 25 | --- | ||
| 43 | 26 | ||
| 44 | - **Universal links** (e.g. tapping a git.sr.ht URL in Safari opens Hutch): | 27 | ### lists.sr.ht |
| 45 | Requires Sourcehut to host an apple-app-site-association file on their | ||
| 46 | servers. This is outside our control. The hutch:// custom URL scheme works as | ||
| 47 | a fallback for links we generate ourselves. | ||
| 48 | 28 | ||
| 49 | - **Push notifications for builds and tickets**: The sr.ht API only supports | 29 | - **Endpoint:** [https://lists.sr.ht/graphql](https://lists.sr.ht/graphql) |
| 50 | server-side webhooks (HTTP POST to a URL you control). Delivering push | 30 | - **Scope:** `LISTS:RO` |
| 51 | notifications to iOS would require a backend relay server to receive webhooks | ||
| 52 | and forward them via APNs. Out of scope for a personal app with no backend. | ||
| 53 | 31 | ||
| 54 | - **Contribution activity / GitHub-style heatmap**: No aggregate contributions | 32 | **Tasks:** |
| 55 | endpoint exists in the sr.ht GraphQL API. Computing this would require | ||
| 56 | paginating every repository's full commit log and filtering by author -- | ||
| 57 | extremely slow and not practical. | ||
| 58 | 33 | ||
| 59 | - **Explore / search (hub.sr.ht)**: The public hub.sr.ht GraphQL API does not | 34 | - Show the authenticated user’s mailing lists |
| 60 | expose repository discovery/search or a projects feed comparable to | 35 | - Allow browsing email threads |
| 61 | https://sr.ht/projects. | 36 | - Display individual emails as plain text |
| 62 | 37 | ||
| 63 | - **Pronouns on profile**: Not exposed in the meta.sr.ht GraphQL schema. The | 38 | --- |
| 64 | field exists in the web UI but is not available to external API clients. | 39 | |
| 40 | ### pages.sr.ht | ||
| 41 | |||
| 42 | - **Endpoint:** [https://pages.sr.ht/graphql](https://pages.sr.ht/graphql) | ||
| 43 | |||
| 44 | **Tasks:** | ||
| 45 | |||
| 46 | - Show the authenticated user’s published sites | ||
| 47 | - Display site metadata, publishing status, and access control where supported | ||
| 48 | - For managing Pages sites, not browsing public project discovery | ||
| 49 | |||
| 50 | --- | ||
| 51 | |||
| 52 | ### Donation Page / In-App Purchases | ||
| 53 | |||
| 54 | - Add a donation/support page once the App Store / StoreKit setup is ready | ||
| 55 | |||
| 56 | --- | ||
| 57 | |||
| 58 | ## Out of Scope | ||
| 65 | 59 | ||
| 66 | - **Revoke personal access tokens**: The revokePersonalAccessToken mutation is | 60 | - Universal links (requires Sourcehut to host an apple-app-site-association |
| 67 | marked @internal in the meta.sr.ht schema and is not accessible to external | 61 | file) |
| 68 | clients. | 62 | - Push notifications for builds and tickets (requires a backend relay server) |
| 63 | - Contribution activity / GitHub-style heatmap (no aggregate endpoint, | ||
| 64 | impractical to compute) | ||
| 65 | - Explore / search (hub.sr.ht) (no public discovery API) | ||
| 66 | - Pronouns on profile (not in GraphQL schema) | ||
| 67 | - Revoke personal access tokens (`@internal` in schema, inaccessible) | ||