Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

289 linesCodeBlameRaw
1---
2title: The phone app
3description: g1t on Android and iOS, built with Expo. Highly experimental and barely working yet. Android first, downloaded from g1t.sh while it waits for Google Play.
4---
5
6The phone app is meant to be g1t on Android and iOS, with its own
7screens for what you do away from a desk: triaging and discussing
8[work items](/work/work-items/) in Work, talking with your team in
9Chat, with notifications on your phone, and reviewing pull requests in
10Code. Everything else opens on the site, in your phone's browser.
11
12:::caution[Highly experimental]
13The phone app is early and barely works yet: expect missing screens,
14rough edges and things that break. For real work, use
15[the desktop app](/guides/desktop/) or g1t in your phone's browser.
16:::
17
18## Install it
19
20Android comes first. Get it from [g1t.sh/download](https://g1t.sh/download):
21the page opens on **Android** when you visit it on an Android phone, and
22[g1t.sh/download?platform=android](https://g1t.sh/download?platform=android)
23opens it from anywhere.
24
251. On your Android phone, choose **Download for Android**. On a computer,
26 scan the code beside it with the phone's camera instead.
272. Open the downloaded file. Android asks once to allow your browser to
28 install apps: allow it. If Play Protect warns about an unknown app,
29 choose **More details**, then **Install anyway**.
303. Open **g1t** and choose **Sign in with g1t**.
31
32Point at the file's name on the page to see its SHA-256, to check the file
33you have is the one g1t published. Like every g1t build during the alpha,
34the app isn't code-signed yet, which is why Android warns
35([unsigned during the alpha](/guides/desktop/#unsigned-during-the-alpha)).
36
37**Why a download, and not Google Play?** Google Play and the App Store
38publish a company's apps only once it is verified with a D-U-N-S number,
39and Flagon's is on its way. Until then the Android app is published on
40g1t.sh, as [the desktop app](/guides/desktop/) is. It moves
41into Google Play as soon as it can. iOS has no way in but the App Store,
42so it follows then.
43
44**Updates** reach the app by themselves: most arrive the next time you
45open it, with nothing to install. A change that needs a new install is a
46new release on the download page; installing it over the one you have
47keeps you signed in.
48
49The bar along the bottom is the site's phone bar:
50
51| Tab | What is on it |
52| --- | --- |
53| **Home** | Coming. Opens Home on the site meanwhile. |
54| **Work** | The workspace's work items, their Board and the sessions working on them: **Items**, **Board** and **Sessions** at its top. For every member, Code access or not. See [Work](#work) and [Sessions](#sessions). |
55| **Chat** | Your starred conversations, channels and direct messages, with what is unread, moving live. See [Chat](#chat). |
56| **Notifications** | Coming. Opens your notifications on the site meanwhile; messages to you already arrive [on the phone](#notifications). |
57| **More** | **Explore** first, which opens on the site, then **Code**, for members with Code access; whether this phone gets notifications, your workspaces, how you signed in, and **Sign out**. |
58
59**Code**, under **More**, is the workspace's repositories, each with its
60pull requests and its **Work**: the work items linked to it. A pull
61request shows its description, checks, conversation and changed files,
62and you can approve it or ask for changes.
63
64## Work
65
66Work on the phone is the site's [Work](/work/), laid out for one hand. A
67switch at its top, **Items | Board | Sessions**, chooses between the list,
68the Board and [Sessions](#sessions).
69
70- **The list** shows the workspace's work items, newest first, with
71 **Open**, **Closed** and **All** under the switch: each with its number,
72 title, state, labels and the repositories it is linked to, which fold
73 into "+2" past the first few. Pull down to read it again; it loads more
74 as you near its end.
75- **Filters** are in a sheet: tap the filter button in the header, a
76 filter's chip above the list, or **Work** in the bar again. Choose the
77 state, **Assigned to me**, a label, a milestone, a repository and its role.
78- **A work item** shows its description and comments (in Markdown, with
79 `#123` references opening what they name), its labels, milestone and
80 assignees, and under them its repositories: each with its role, its pull
81 requests for the item and whether the work **landed** there, and which
82 targets are still missing. **Suggested** repositories can be added as
83 targets with a tap.
84- **The bar at its foot** comments. Its **⋯** closes the work item (as
85 done, or as not planned), reopens it, links a repository as a target,
86 copies its link, or opens it on the site. Tap a repository to open it or
87 unlink it.
88- **New work item** (**+ New** on Work) takes a title, a description,
89 labels and the repositories it should land in; none is fine. Opened from
90 the list filtered to a repository, that repository is its origin, and
91 starts as a target too.
92- **The Board** is the site's [Board](/work/board/):
93 **Backlog**, **In progress**, **In review**, **Landing** and **Done**,
94 one under another, with a chip for each to show one alone. Each card is
95 a work item with who or which session is on it. Tap a card to open the
96 work item.
97
98## Sessions
99
100**Sessions** is the site's [Sessions](/work/sessions/),
101a section of Work: the sessions at work across the workspace. Choose
102**Sessions** at the top of **Work**, beside **Items** and **Board**.
103
104- **Everything**, **Live** and **Recent** at the top choose what it
105 lists. Pull down to read it again.
106- **Filters** are in a sheet: **Started by me**, and a repository. Tap
107 **Work** in the bar again to open it.
108- **A session** shows its facts (who, harness, repository, branch, state,
109 when it was last heard from), what it is working on (its work item and
110 pull request), its subagents as a tree, the files it touched, and its
111 timeline.
112
113## Chat
114
115Chat on the phone is the site's Chat: the same conversations, as they
116happen.
117
118- **Conversations** show messages as the site draws them: bold, italic,
119 code, lists, quotes, tables and links, with `@mentions`, `#channels`
120 and `#123` references standing out. Messages by one person a few minutes
121 apart run together, and each day is marked.
122- **Live.** New messages, edits, deletions and reactions appear as they
123 happen, and the line above the box says who is typing. Unread counts in
124 the list and on the **Chat** tab move as messages arrive anywhere.
125- **Sending** shows your message at once. If it doesn't reach g1t, it
126 stays, marked **Not sent**: tap it to try again.
127- **Long-press a message** to react, reply in a thread, copy it, or edit
128 or delete your own. Tap a reaction to add yours or take it back.
129- **Threads** open from a message's replies, with the message they are
130 under at the top.
131- **⋯** on a conversation stars, mutes or leaves it.
132- **New message** (the pen at the top of Chat) messages a person, or a few
133 people together, or makes a channel. **Browse** at the
134 foot of the list joins public channels.
135
136A notification for a conversation you have open is not shown; one for
137another shows as a banner at the top of the screen.
138
139## Notifications
140
141The phone gets the same notifications as [browser push](/guides/notifications/#on-your-phone):
142messages to you, mentions and replies in threads you are in, under the
143same rules. Nothing comes while you are using
144g1t in a browser or in the app itself, and nothing in
145[Do not disturb](/guides/chat/#sounds-and-do-not-disturb). Tapping one
146opens the conversation or thread it is about.
147
148The app asks to notify you the first time you sign in. To change it
149later, use **More → Notifications on this phone**, or the phone's own
150settings for g1t, where Android lists the **Messages** channel. Signing
151out stops them on that phone.
152
153## Signing in
154
155**Sign in with g1t** opens g1t.sh in your phone's browser, where you sign
156in as usual (with your password, GitHub, two-factor) and approve the app.
157The browser sends you back to the app, signed in. The app never sees your
158password. This is [OAuth](/guides/authentication/#signing-in-with-oauth):
159the app is listed as **g1t for Android** or **g1t for iOS** in
160[Settings → Connected applications](https://g1t.sh/settings/applications),
161where **Change access** narrows what it can do and **Sign out** ends it at
162once.
163
164The approval page lists what the app asks for: reading your account,
165workspaces, repositories, checks and workflows, reading and writing
166work items, pull requests and notifications, and reading artifacts. Untick what you would rather it
167could not do.
168
169**Use an access token** signs in with a
170[personal access token](/guides/authentication/#access-tokens) you paste
171in instead. The token stays on your phone, in its keystore.
172
173The app asks for `chat:read` and `chat:write` too. They let it use
174Chat's routes and live connections on the site, and register for
175notifications, and nothing else there: the app's sign-in cannot open the
176site's pages as you.
177
178## Links
179
180A `g1t://` link opens the app, as it opens [the desktop app](/guides/desktop/#links):
181`g1t://acme/-/chat/dm/chn_1` is that conversation. The app shows the
182pages it has screens for:
183
184| Link | Opens |
185| --- | --- |
186| `g1t://<workspace>/-/work`, with the list's filters (`?repo=web&label=bug`) | Work, filtered as the link says |
187| `g1t://<workspace>/-/work/<number>` | The work item |
188| `g1t://<workspace>/-/work/new` | A new work item |
189| `g1t://<workspace>/-/work/board` | Work, on the Board |
190| `g1t://<workspace>/-/work/sessions`, with its filters (`?state=live&repo=web`) | Work, on Sessions |
191| `g1t://<workspace>/-/work/sessions/<id>` | The session |
192| `g1t://<workspace>/-/chat`, `…/-/chat/<channel>`, `…/-/chat/dm/<id>` | Chat, or the conversation, in that workspace |
193| `g1t://<owner>/<repo>` | The repository |
194| `g1t://<owner>/<repo>/pull/<number>` | The pull request |
195| `g1t://<owner>/<repo>/issues/<number>` | What that old issue number names in the repository: the work item the issue became, or a pull request. The app asks g1t, as the site does. `…/issues` and `…/issues/new` open Work filtered to the repository, and a new work item from it. |
196
197The same paths as `https://g1t.sh/…` links, such as
198`https://g1t.sh/<workspace>/-/work/<number>` or
199`https://g1t.sh/<workspace>/-/work/sessions/<id>`, open these screens once
200g1t.sh publishes the files Android and iOS check first (see
201[below](#whats-not-there-yet)). The workspace's labels and milestones open
202on the site.
203
204Any other page opens on the site, in the browser.
205
206## Your own g1t
207
208The app works with a g1t you [run yourself](/guides/self-hosting/) as well
209as with g1t.sh. It talks to one g1t at a time, and opens on g1t.sh unless
210you point it elsewhere. Two ways to point it at yours:
211
212- **Scan its code.** Your g1t's download page, `<your g1t>/download`, has
213 a QR code under its platforms, **Use the phone app with** your g1t. Scan it with the phone's camera, or
214 open the page on the phone and choose **Open in the g1t app**. The app
215 asks **Use g1t.example.com?**, then signs you in there.
216- **Type its address.** On the sign-in screen, choose **Using your own
217 g1t? Sign in there** and enter the address you open it at in a browser,
218 such as `g1t.example.com`.
219
220Either way the app reads `<your g1t>/.well-known/g1t.json`, where your g1t
221says where its API is, so you never type that. A g1t from before the phone
222app has no such file: the app then takes the API to be `api.` in front of
223the site, and offers **Its API is at another address** if it is not.
224
225The sign-in screen then says **Signing in to g1t.example.com**, with
226**Change** and **Use g1t.sh**. Switching signs you out of the g1t you were
227on.
228
229| Your g1t | What to know |
230| --- | --- |
231| 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. |
232| `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. |
233| 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. |
234| 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**. |
235
236## What's not there yet
237
238- **Google Play and the App Store**, once Flagon's D-U-N-S number
239 arrives ([above](#install-it)). Until then, Android from the download
240 page; iOS waits for the App Store.
241- **Home, Notifications and Artifacts** as tabs of their own.
242 Their pages open on the site meanwhile.
243- **More of Work.** Changing an existing work item's labels, assignees
244 or milestone, reacting, and the workspace's **Labels** and
245 **Milestones** pages are on the site for now.
246- **Attachments and custom emoji.** Files in messages, and a
247 workspace's own `:emoji:`, show as their names.
248- **Replying from a notification**, without opening the app.
249- **https links.** `g1t.sh` addresses open the site in the browser, not
250 the app, until g1t.sh publishes the files Android and iOS check first.
251
252## For operators: building and releasing
253
254The app lives in `apps/mobile`: [Expo](https://expo.dev) with Expo
255Router, in TypeScript, sharing types with the site through
256`@g1t/contracts`. It builds with EAS Build. `apps/mobile/README.md` has
257the commands for running it on a phone and the first-time setup.
258
259| Build | Command | What it makes |
260| --- | --- | --- |
261| Development | `eas build --profile development --platform android` | An APK of `g1t (dev)` (`sh.g1t.app.dev`) that loads its code from your computer. |
262| Preview | `npm run build:android:apk -w @g1t/mobile` | An APK of `g1t` (`sh.g1t.app.preview`) to install on testers' phones. |
263| Production | `npm run build:android -w @g1t/mobile` | An Android App Bundle of `g1t` (`sh.g1t.app`) for Google Play. |
264
265The three install side by side. `eas submit --platform android` sends
266the latest production build to Google Play's internal testing track as a
267draft, once there is a Play account to send it to.
268
269### Releasing on g1t.sh/download
270
271Until the app is in Google Play, the `preview` build is the one people
272install, from g1t.sh/download. A release is a tag `mobile-v<version>`,
273where the version is `version` in `apps/mobile/app.config.ts`: push it,
274and the `Mobile release` workflow (`.g1t/workflows/mobile-release.yml`)
275has EAS build the APK, then publishes it to the `g1t-downloads` bucket
276at `g1t.sh/downloads/mobile/<version>/` and points `mobile/latest.json`
277at it, which the download page reads. `scripts/mobile-release.mjs` does
278the same by hand (`build`, `fetch`, `manifest`, `publish`).
279
280| Secret or variable | What it is |
281| --- | --- |
282| `EXPO_TOKEN` | An Expo access token with access to the g1t project, from expo.dev |
283| `CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ACCOUNT_ID` | As the deploy has them |
284
285Most changes need no release: `eas update --channel preview` in
286`apps/mobile` sends the app's new code to every installed copy of that
287version, which takes it the next time it opens. A release is for a change
288to the app's native side (a new native module, `app.config.ts`) or its
289`version`, which is also what decides which updates a copy takes.