| 1 | --- |
| 2 | title: The phone app |
| 3 | description: g1t on Android and iOS, built with Expo. Chat with people and agents, live, with notifications on your phone, and Code and Customize, signed in with g1t's own OAuth. Android first, downloaded from g1t.sh while it waits for Google Play. |
| 4 | --- |
| 5 | |
| 6 | The phone app is g1t on Android and iOS, with its own screens for what |
| 7 | you do away from a desk: talking with your team and its agents in Chat, |
| 8 | with notifications on your phone, reviewing what agents made in Code, |
| 9 | and seeing the skills, connectors and plugins your workspace can use in |
| 10 | Customize. Everything else opens on the site, in your phone's browser. |
| 11 | |
| 12 | ## Install it |
| 13 | |
| 14 | Android comes first. Get it from [g1t.sh/download](https://g1t.sh/download), |
| 15 | under **On your phone**: |
| 16 | |
| 17 | 1. On your Android phone, choose **Download for Android**. On a computer, |
| 18 | scan the code there with the phone's camera instead. |
| 19 | 2. Open the downloaded file. Android asks once to allow your browser to |
| 20 | install apps: allow it. |
| 21 | 3. Open **g1t (beta)** and choose **Sign in with g1t**. |
| 22 | |
| 23 | The page shows each release's SHA-256, to check the file you have is the |
| 24 | one g1t published. |
| 25 | |
| 26 | **Why a download, and not Google Play?** Google Play and the App Store |
| 27 | publish a company's apps only once it is verified with a D-U-N-S number, |
| 28 | and Flagon's is on its way. Until then the Android app is published on |
| 29 | g1t.sh, signed by g1t, as [the desktop app](/guides/desktop/) is. It moves |
| 30 | into Google Play as soon as it can. iOS has no way in but the App Store, |
| 31 | so it follows then. |
| 32 | |
| 33 | **Updates** reach the app by themselves: most arrive the next time you |
| 34 | open it, with nothing to install. A change that needs a new install is a |
| 35 | new release on the download page; installing it over the one you have |
| 36 | keeps you signed in. |
| 37 | |
| 38 | The bar along the bottom is the site's phone bar: |
| 39 | |
| 40 | | Tab | What is on it | |
| 41 | | --- | --- | |
| 42 | | **Home** | Coming. Opens Home on the site meanwhile. | |
| 43 | | **Chat** | Your starred conversations, channels and direct messages, with what is unread, moving live. See [Chat](#chat). | |
| 44 | | **Notifications** | Coming. Opens your notifications on the site meanwhile; messages to you already arrive [on the phone](#notifications). | |
| 45 | | **Agents** | Coming. Opens Agents on the site meanwhile; message any agent from Chat. | |
| 46 | | **Code** | The workspace's repositories, each with its pull requests and issues. A pull request shows its description, checks, conversation and changed files, and you can approve it or ask for changes. An issue shows the pull requests made for it, and you can comment. Shown when you use Code in the workspace. | |
| 47 | | **More** | **Customize** (skills, connectors and plugins), whether this phone gets notifications, your workspaces, how you signed in, and **Sign out**. | |
| 48 | |
| 49 | ## Chat |
| 50 | |
| 51 | Chat on the phone is the site's Chat: the same conversations, as they |
| 52 | happen. |
| 53 | |
| 54 | - **Conversations** show messages as the site draws them: bold, italic, |
| 55 | code, lists, quotes, tables and links, with `@mentions`, `#channels` |
| 56 | and `#123` references standing out. Messages by one person a few minutes |
| 57 | apart run together, and each day is marked. |
| 58 | - **Live.** New messages, edits, deletions and reactions appear as they |
| 59 | happen, and the line above the box says who is typing. Unread counts in |
| 60 | the list and on the **Chat** tab move as messages arrive anywhere. |
| 61 | - **Sending** shows your message at once. If it doesn't reach g1t, it |
| 62 | stays, marked **Not sent**: tap it to try again. |
| 63 | - **Agents' cards** work: their buttons (approve more budget, stop a |
| 64 | session, file a draft issue) act from the phone, asking first or asking |
| 65 | for an amount when the card does, and the card updates in place. |
| 66 | - **Long-press a message** to react, reply in a thread, copy it, or edit |
| 67 | or delete your own. Tap a reaction to add yours or take it back. |
| 68 | - **Threads** open from a message's replies, with the message they are |
| 69 | under at the top. |
| 70 | - **⋯** on a conversation stars, mutes or leaves it. |
| 71 | - **New message** (the pen at the top of Chat) messages a person or an |
| 72 | agent, or a few of them together, or makes a channel. **Browse** at the |
| 73 | foot of the list joins public channels. |
| 74 | |
| 75 | A notification for a conversation you have open is not shown; one for |
| 76 | another shows as a banner at the top of the screen. |
| 77 | |
| 78 | ## Notifications |
| 79 | |
| 80 | The phone gets the same notifications as [browser push](/guides/notifications/#on-your-phone): |
| 81 | messages to you, mentions, replies in threads you are in, and agents |
| 82 | waiting on you, under the same rules. Nothing comes while you are using |
| 83 | g1t in a browser or in the app itself, and nothing in |
| 84 | [Do not disturb](/guides/chat/#sounds-and-do-not-disturb). Tapping one |
| 85 | opens the conversation or thread it is about. |
| 86 | |
| 87 | The app asks to notify you the first time you sign in. To change it |
| 88 | later, use **More → Notifications on this phone**, or the phone's own |
| 89 | settings for g1t, where Android lists the **Messages** channel. Signing |
| 90 | out stops them on that phone. |
| 91 | |
| 92 | ## Signing in |
| 93 | |
| 94 | **Sign in with g1t** opens g1t.sh in your phone's browser, where you sign |
| 95 | in as usual (with your password, GitHub, two-factor) and approve the app. |
| 96 | The browser sends you back to the app, signed in. The app never sees your |
| 97 | password. This is [OAuth](/guides/authentication/#signing-in-with-oauth): |
| 98 | the app is listed as **g1t for Android** or **g1t for iOS** in |
| 99 | [Settings → Connected applications](https://g1t.sh/settings/applications), |
| 100 | where **Change access** narrows what it can do and **Sign out** ends it at |
| 101 | once. |
| 102 | |
| 103 | The approval page lists what the app asks for: reading your account, |
| 104 | workspaces, repositories, checks and workflows, reading and writing |
| 105 | issues, pull requests and notifications, recalling memory, reading |
| 106 | artifacts, and putting agents to work. Untick what you would rather it |
| 107 | could not do. |
| 108 | |
| 109 | **Use an access token** signs in with a |
| 110 | [personal access token](/guides/authentication/#access-tokens) you paste |
| 111 | in instead. The token stays on your phone, in its keystore. |
| 112 | |
| 113 | The app asks for `chat:read` and `chat:write` too. They let it use |
| 114 | Chat's routes and live connections on the site, and register for |
| 115 | notifications, and nothing else there: the app's sign-in cannot open the |
| 116 | site's pages as you. |
| 117 | |
| 118 | ## Links |
| 119 | |
| 120 | A `g1t://` link opens the app, as it opens [the desktop app](/guides/desktop/#links): |
| 121 | `g1t://acme/-/chat/dm/chn_1` is that conversation. The app shows the |
| 122 | pages it has screens for: |
| 123 | |
| 124 | | Link | Opens | |
| 125 | | --- | --- | |
| 126 | | `g1t://<workspace>/-/chat`, `…/-/chat/<channel>`, `…/-/chat/dm/<id>` | Chat, or the conversation, in that workspace | |
| 127 | | `g1t://<owner>/<repo>` | The repository | |
| 128 | | `g1t://<owner>/<repo>/pull/<number>`, `…/issues/<number>` | The pull request or issue | |
| 129 | | `g1t://<workspace>/-/customize…`, `…/-/agents/skills` | [Customize](/guides/customize/). The old `…/-/marketplace…` links open it too | |
| 130 | |
| 131 | Any other page opens on the site, in the browser. |
| 132 | |
| 133 | ## Your own g1t |
| 134 | |
| 135 | The app works with a g1t you [run yourself](/guides/self-hosting/) as well |
| 136 | as with g1t.sh. It talks to one g1t at a time, and opens on g1t.sh unless |
| 137 | you point it elsewhere. Two ways to point it at yours: |
| 138 | |
| 139 | - **Scan its code.** Your g1t's download page, `<your g1t>/download`, has |
| 140 | a QR code under **On your phone**. Scan it with the phone's camera, or |
| 141 | open the page on the phone and choose **Open in the g1t app**. The app |
| 142 | asks **Use g1t.example.com?**, then signs you in there. |
| 143 | - **Type its address.** On the sign-in screen, choose **Using your own |
| 144 | g1t? Sign in there** and enter the address you open it at in a browser, |
| 145 | such as `g1t.example.com`. |
| 146 | |
| 147 | Either way the app reads `<your g1t>/.well-known/g1t.json`, where your g1t |
| 148 | says where its API is, so you never type that. A g1t from before the phone |
| 149 | app has no such file: the app then takes the API to be `api.` in front of |
| 150 | the site, and offers **Its API is at another address** if it is not. |
| 151 | |
| 152 | The sign-in screen then says **Signing in to g1t.example.com**, with |
| 153 | **Change** and **Use g1t.sh**. Switching signs you out of the g1t you were |
| 154 | on. |
| 155 | |
| 156 | | Your g1t | What to know | |
| 157 | | --- | --- | |
| 158 | | Reached by the phone | `PUBLIC_URL` and `API_URL` must be addresses the phone can open. `localhost` on a phone is the phone itself: use your computer's address on the network, or a domain. | |
| 159 | | `https` | Store builds of the app open `https` addresses only, as Android requires. A development build also opens `http`, for a g1t on your own network. | |
| 160 | | Notifications | Work with no setup: your g1t sends them through Expo's push service, as g1t.sh does. To keep notifications' words off Expo's, Google's and Apple's services, set `PHONE_PUSH=off` ([self-hosting](/guides/self-hosting/#the-phone-app)); the app then says your g1t sends no notifications, and Chat still updates while it is open. | |
| 161 | | Older versions | A g1t from before the phone app does not let the app's sign-in into Chat. Upgrade it, or sign in with an access token that has **Use the website as you**. | |
| 162 | |
| 163 | ## What's not there yet |
| 164 | |
| 165 | - **Google Play and the App Store**, once Flagon's D-U-N-S number |
| 166 | arrives ([above](#install-it)). Until then, Android from the download |
| 167 | page; iOS waits for the App Store. |
| 168 | - **Home, Notifications, Agents and Artifacts** as tabs of their own. |
| 169 | Their pages open on the site meanwhile. |
| 170 | - **Formatting in Code.** Descriptions and comments show their Markdown |
| 171 | as written; messages in Chat are formatted. |
| 172 | - **Attachments and custom emoji.** Files in messages, and a |
| 173 | workspace's own `:emoji:`, show as their names. |
| 174 | - **Replying from a notification**, without opening the app. |
| 175 | - **https links.** `g1t.sh` addresses open the site in the browser, not |
| 176 | the app, until g1t.sh publishes the files Android and iOS check first. |
| 177 | |
| 178 | ## For operators: building and releasing |
| 179 | |
| 180 | The app lives in `apps/mobile`: [Expo](https://expo.dev) with Expo |
| 181 | Router, in TypeScript, sharing types with the site through |
| 182 | `@g1t/contracts`. It builds with EAS Build. `apps/mobile/README.md` has |
| 183 | the commands for running it on a phone and the first-time setup. |
| 184 | |
| 185 | | Build | Command | What it makes | |
| 186 | | --- | --- | --- | |
| 187 | | Development | `eas build --profile development --platform android` | An APK of `g1t (dev)` (`sh.g1t.app.dev`) that loads its code from your computer. | |
| 188 | | Preview | `npm run build:android:apk -w @g1t/mobile` | An APK of `g1t (beta)` (`sh.g1t.app.preview`) to install on testers' phones. | |
| 189 | | Production | `npm run build:android -w @g1t/mobile` | An Android App Bundle of `g1t` (`sh.g1t.app`) for Google Play. | |
| 190 | |
| 191 | The three install side by side. `eas submit --platform android` sends |
| 192 | the latest production build to Google Play's internal testing track as a |
| 193 | draft, once there is a Play account to send it to. |
| 194 | |
| 195 | ### Releasing on g1t.sh/download |
| 196 | |
| 197 | Until the app is in Google Play, the `preview` build is the one people |
| 198 | install, from g1t.sh/download. A release is a tag `mobile-v<version>`, |
| 199 | where the version is `version` in `apps/mobile/app.config.ts`: push it, |
| 200 | and the `Mobile release` workflow (`.g1t/workflows/mobile-release.yml`) |
| 201 | has EAS build the APK, then publishes it to the `g1t-downloads` bucket |
| 202 | at `g1t.sh/downloads/mobile/<version>/` and points `mobile/latest.json` |
| 203 | at it, which the download page reads. `scripts/mobile-release.mjs` does |
| 204 | the same by hand (`build`, `fetch`, `manifest`, `publish`). |
| 205 | |
| 206 | | Secret or variable | What it is | |
| 207 | | --- | --- | |
| 208 | | `EXPO_TOKEN` | An Expo access token with access to the g1t project, from expo.dev | |
| 209 | | `CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ACCOUNT_ID` | As the deploy has them | |
| 210 | |
| 211 | Most changes need no release: `eas update --channel preview` in |
| 212 | `apps/mobile` sends the app's new code to every installed copy of that |
| 213 | version, which takes it the next time it opens. A release is for a change |
| 214 | to the app's native side (a new native module, `app.config.ts`) or its |
| 215 | `version`, which is also what decides which updates a copy takes. |