Diffinery

codician/diffinerypublic

Open-source, agent-first GitHub and GitHub Actions alternative that runs on your own Cloudflare account: git hosting, pull requests, code review and drop-in GitHub Actions YAML on Workers, Durable Objects, R2 and Containers.

Use "diffy" instead of GitHub's Octocat in examples and placeholders (#39)

Diffy is Diffinery's own example user. The docs, form placeholders (people,
collaborators, the GitHub importer), email samples and tests use it where they
said octocat.


Claude-Session: https://claude.ai/code/session_01QMFviVKD61QaDPxdrh7C3f

Co-authored-by: Claude <noreply@anthropic.com>
Canberk Demirci authored · GitHub committed signed1 parent 6b6c691commit 87938449a3ab32e1cce7f7c5304b88d105edc755Browse files
30 files changed+153−153
Files (30)
modifiedapps/diffinery/docs/accounts/invitations.md+9−9View file
@@ -43,13 +43,13 @@
4343 Organization owners and admins, and site administrators. The **Add people** form on the organization's **People** tab takes a username or an email address.
4444
4545 1. Open the organization's page, for example `https://diffinery.com/acme`, and click the **People** tab.
46-2. Under **Add people**, enter a **Username or email**: `octocat` (or `@octocat`) for someone who has an account, or `friend@example.com` for anyone.
46+2. Under **Add people**, enter a **Username or email**: `diffy` (or `@diffy`) for someone who has an account, or `friend@example.com` for anyone.
4747 3. Choose a **Role**: **Member** (default), **Admin** or **Owner**. Only owners can choose **Owner**.
4848 4. Click **Add**.
4949
5050 | You entered | What happens |
5151 | --- | --- |
52-| A username, or the email address of an existing account | They join right away, with no invitation to accept: "Added octocat to acme as member. We let them know." They get an email and an in-app notification. |
52+| A username, or the email address of an existing account | They join right away, with no invitation to accept: "Added diffy to acme as member. We let them know." They get an email and an in-app notification. |
5353 | An email address without an account | Diffinery emails an invitation. The page shows **Invitation sent to friend@example.com** with the link and a copy button, and the note "They don't have an account yet, so we emailed them an invitation. You can also send them this link yourself. It works once and expires in 14 days: opening it creates their account and passkey and adds them here." |
5454
5555 The invitation then appears under **Pending invitations** on the same tab, with who sent it, when, the expiry date and the role. See [Organizations](/docs/accounts/organizations#add-people) for every message the form can show.
@@ -70,20 +70,20 @@
7070
7171 Repository admins. The **Add people** form on the repository's **Settings → Collaborators** page (`/acme/website/settings/access`) works the same way, and also accepts agents:
7272
73-1. Under **Add people**, enter a **Username or email**: a person (`octocat`), an agent (`review-bot`) or an email address (`friend@example.com`).
73+1. Under **Add people**, enter a **Username or email**: a person (`diffy`), an agent (`review-bot`) or an email address (`friend@example.com`).
7474 2. Choose a **Role**: **Read**, **Triage**, **Write** (default), **Maintain** or **Admin**.
7575 3. Click **Add**.
7676
7777 | You entered | What happens |
7878 | --- | --- |
79-| The username of a person or an agent, or the email address of an existing account | They get the role right away as a direct collaborator: "octocat now has write access. We let them know." People get an email and an in-app notification. If they already were a collaborator, their role changes to the one you chose. |
79+| The username of a person or an agent, or the email address of an existing account | They get the role right away as a direct collaborator: "diffy now has write access. We let them know." People get an email and an in-app notification. If they already were a collaborator, their role changes to the one you chose. |
8080 | An email address without an account | Diffinery emails an invitation and shows **Invitation sent to friend@example.com** with the link to send yourself. When the person joins, they get that role on the repository. |
8181
8282 | Message | Cause |
8383 | --- | --- |
84-| "no one has the username octocat; to invite someone new, enter their email address" | No account has that username. |
84+| "no one has the username diffy; to invite someone new, enter their email address" | No account has that username. |
8585 | "acme is an organization; add its people instead" | Organizations can't be collaborators. |
86-| "octocat's account is disabled" | A site administrator disabled the account. |
86+| "diffy's account is disabled" | A site administrator disabled the account. |
8787 | "enter a valid email address" | The text has an `@` but isn't a complete address. |
8888
8989 The repository's **Settings → Collaborators** page doesn't list pending invitations. See [Permissions](/docs/accounts/permissions) for what each role allows.
@@ -184,9 +184,9 @@
184184
185185 | Invite | Subject |
186186 | --- | --- |
187-| Organization | `@octocat invited you to join the acme organization on Diffinery` |
188-| Repository | `@octocat invited you to collaborate on acme/website` |
189-| Instance | `@octocat invited you to Diffinery` |
187+| Organization | `@diffy invited you to join the acme organization on Diffinery` |
188+| Repository | `@diffy invited you to collaborate on acme/website` |
189+| Instance | `@diffy invited you to Diffinery` |
190190
191191 The email lists who invited you, the organization or repository and the role (for organization and repository invites) and the expiry date, and has an **Accept invitation** button. It says the invitation only works for that email address. Invite emails can't be turned off, because they are the only way to reach someone without an account.
192192
modifiedapps/diffinery/docs/accounts/notifications.md+14−14View file
@@ -18,7 +18,7 @@
1818
1919 ## The notifications list
2020
21-The bell in the header opens **Notifications** (`/notifications`). It has two views, **Unread** and **All**, and shows your 100 most recent notifications. Each entry has an icon for its kind (a pull request, an issue, a comment, a failed run in red, an organization or a repository), a title such as `octocat commented on acme/website#42: Cache build artifacts`, its kind (for example `issue comment`, `pull request review` or `run failed`) and when it happened.
21+The bell in the header opens **Notifications** (`/notifications`). It has two views, **Unread** and **All**, and shows your 100 most recent notifications. Each entry has an icon for its kind (a pull request, an issue, a comment, a failed run in red, an organization or a repository), a title such as `diffy commented on acme/website#42: Cache build artifacts`, its kind (for example `issue comment`, `pull request review` or `run failed`) and when it happened.
2222
2323 - Click an entry to open what it is about; that marks it read.
2424 - Click the check mark (**Mark as read**) next to an unread entry to mark only that one read.
@@ -187,7 +187,7 @@
187187
188188 | Header | Value |
189189 | --- | --- |
190-| `From` | `notifications@diffinery.com`. The display name is the person who acted, for issue and pull request emails (`octocat (Diffinery)`), otherwise `Diffinery`. |
190+| `From` | `notifications@diffinery.com`. The display name is the person who acted, for issue and pull request emails (`diffy (Diffinery)`), otherwise `Diffinery`. |
191191 | `Subject` | Issue and pull request emails: `[acme/website] <title> (PR #42)` or `(Issue #37)`, with `Re: ` for every email after the first. Others start with `[acme/website]` or `[Diffinery]`. |
192192 | `X-Diffinery-Reason` | Why you got the email (see below), like GitHub's `X-GitHub-Reason` |
193193 | `X-Diffinery-Kind` | The email template, for example `thread`, `run` or `signin_new` (see [Every email Diffinery sends](#every-email-diffinery-sends)) |
@@ -234,11 +234,11 @@
234234 | `push_blocked` | `[acme/website] Your push was blocked: possible secrets` | Security | `security_alert` | Push protection rejected your push (for an agent's push, its owner is told) |
235235 | `push_bypassed` | `[acme/website] Push protection was bypassed` | Security | `security_alert` | A repository admin pushed past push protection; sent to the pusher and the repository's admins |
236236 | `account_status` | `[Diffinery] Your account was disabled` or `Your account was enabled` | Security | `account` | A site administrator disabled your account, or enabled it again |
237-| `invite` | `@octocat invited you to join the acme organization on Diffinery` | Account | `invitation` | Someone invited your email address (organization, repository or instance) |
238-| `welcome` | `Welcome to Diffinery, @octocat` | Account | `account` | You created your account from an invite |
237+| `invite` | `@diffy invited you to join the acme organization on Diffinery` | Account | `invitation` | Someone invited your email address (organization, repository or instance) |
238+| `welcome` | `Welcome to Diffinery, @diffy` | Account | `account` | You created your account from an invite |
239239 | `signin_link` | `[Diffinery] Your one-time sign-in link` | Account | `account` | A site administrator created a sign-in link for you |
240240 | `test` | `[Diffinery] Test email` | Account | `account` | You clicked **Send me a test email** (or used the API) |
241-| `invite_accepted` | `[Diffinery] @octocat accepted your invitation` | Organizations | `account` | Someone accepted an invite you created |
241+| `invite_accepted` | `[Diffinery] @diffy accepted your invitation` | Organizations | `account` | Someone accepted an invite you created |
242242 | `access_request` | `[Diffinery] newcomer@example.com asked for access` | Organizations | `admin` | A person waiting for an invite requested access (sent to site administrators) |
243243 | `org_membership` | `[Diffinery] You're now a member of acme` | Organizations | `account` | Your organization role was added, changed or removed by an owner or admin. The email names who added you ("Added by") or who changed your role ("Changed by"). |
244244 | `repo_access` | `[acme/website] You now have write access to acme/website` | Repositories | `account` | Your collaborator role on a repository was added, changed or removed |
@@ -249,15 +249,15 @@
249249
250250 | Event | Title in the email |
251251 | --- | --- |
252-| Opened | `@octocat wants to merge cache-artifacts into main` (pull request) or `@octocat opened acme/website#37` (issue); includes the description, the pull request's intent and recent commits |
253-| Comment | `@octocat commented on acme/website#42`, with the comment |
254-| Review | `@octocat approved`, `requested changes on` or `reviewed acme/website#42`, with the review and its line comments |
255-| Closed | `@octocat closed acme/website#37 as completed` (or `as not planned`) |
256-| Merged | `@octocat merged acme/website#42 into main` |
257-| Reopened | `@octocat reopened acme/website#37` |
258-| Assigned | `@octocat assigned you to acme/website#37` |
259-| Review requested | `@octocat requested your review on acme/website#42` |
260-| Pushed | `@octocat pushed 2 commits to cache-artifacts`, with the commits |
252+| Opened | `@diffy wants to merge cache-artifacts into main` (pull request) or `@diffy opened acme/website#37` (issue); includes the description, the pull request's intent and recent commits |
253+| Comment | `@diffy commented on acme/website#42`, with the comment |
254+| Review | `@diffy approved`, `requested changes on` or `reviewed acme/website#42`, with the review and its line comments |
255+| Closed | `@diffy closed acme/website#37 as completed` (or `as not planned`) |
256+| Merged | `@diffy merged acme/website#42 into main` |
257+| Reopened | `@diffy reopened acme/website#37` |
258+| Assigned | `@diffy assigned you to acme/website#37` |
259+| Review requested | `@diffy requested your review on acme/website#42` |
260+| Pushed | `@diffy pushed 2 commits to cache-artifacts`, with the commits |
261261
262262 ## Send a test email
263263
modifiedapps/diffinery/docs/accounts/organizations.md+6−6View file
@@ -93,7 +93,7 @@
9393 The **Add people** form takes a username or an email address, like GitHub's "Add people" or "Invite member" dialog:
9494
9595 1. Open `https://diffinery.com/acme?tab=people`.
96-2. In **Username or email**, enter a username (`octocat`, or `@octocat`) or an email address (`friend@example.com`).
96+2. In **Username or email**, enter a username (`diffy`, or `@diffy`) or an email address (`friend@example.com`).
9797 3. Choose a **Role**: **Member** (default) or **Admin**. Owners can also choose **Owner**.
9898 4. Click **Add**.
9999
@@ -101,7 +101,7 @@
101101
102102 | You entered | Result |
103103 | --- | --- |
104-| The username of a person | They become a member right away, with no invitation to accept. You see "Added octocat to acme as member. We let them know." They get an email ("You're now a member of acme", naming who added them) and an in-app notification ("<your username> added you to acme as a member"). |
104+| The username of a person | They become a member right away, with no invitation to accept. You see "Added diffy to acme as member. We let them know." They get an email ("You're now a member of acme", naming who added them) and an in-app notification ("<your username> added you to acme as a member"). |
105105 | The email address of someone who already has an account | The same as entering their username: they are added right away. |
106106 | An email address with no account | Diffinery creates an invitation and emails it. The page shows **Invitation sent to friend@example.com** with the link and a copy button: "They don't have an account yet, so we emailed them an invitation. You can also send them this link yourself. It works once and expires in 14 days: opening it creates their account and passkey and adds them here." |
107107
@@ -111,10 +111,10 @@
111111 | --- | --- |
112112 | "enter a username or an email address" | The field was empty. |
113113 | "enter a valid email address" | The text has an `@` but isn't a complete address such as `friend@example.com`. |
114-| "no one has the username octocat; to invite someone new, enter their email address" | No account has that username. Enter their email address to invite them. |
114+| "no one has the username diffy; to invite someone new, enter their email address" | No account has that username. Enter their email address to invite them. |
115115 | "review-bot is not a person; agents belong to an organization through Settings → Agents" | Agents and organizations can't be members. Create an organization agent instead (see [Organization agents](#organization-agents)). |
116-| "octocat's account is disabled" | A site administrator disabled the account. |
117-| "octocat is already a member of acme" | Change their role in the members table instead. |
116+| "diffy's account is disabled" | A site administrator disabled the account. |
117+| "diffy is already a member of acme" | Change their role in the members table instead. |
118118 | "friend@example.com already has a pending invitation; revoke it first to send a new one" | Revoke the invitation under **Pending invitations**, then add the address again. |
119119 | "only owners can add owners" | Admins can add members and admins only. |
120120 | "organization admins only" | Only owners, admins and site administrators can add people. |
@@ -131,7 +131,7 @@
131131
132132 ### Remove a member
133133
134-Click **Remove** in the member's row and confirm "Remove octocat from acme?". The member loses the organization's repository access on their next request, including through their tokens, and gets an email saying they were removed. Any collaborator roles they or their agents had on the organization's repositories are removed too, including admin on repositories they created. Their personal repositories and accounts are not affected.
134+Click **Remove** in the member's row and confirm "Remove diffy from acme?". The member loses the organization's repository access on their next request, including through their tokens, and gets an email saying they were removed. Any collaborator roles they or their agents had on the organization's repositories are removed too, including admin on repositories they created. Their personal repositories and accounts are not affected.
135135
136136 Rules:
137137
modifiedapps/diffinery/docs/accounts/permissions.md+5−5View file
@@ -95,20 +95,20 @@
9595
9696 Repository admins manage collaborators under **Settings → Collaborators** (`/acme/website/settings/access`):
9797
98-- **Add people**: enter a **Username or email** (a person, an agent or an email address), pick a **Role** (**Read**, **Triage**, **Write**, **Maintain** or **Admin**; default **Write**) and click **Add**. Accounts get the role immediately ("octocat now has write access. We let them know."). An email address without an account gets an invitation; see [Invitations](/docs/accounts/invitations#add-people-to-a-repository).
98+- **Add people**: enter a **Username or email** (a person, an agent or an email address), pick a **Role** (**Read**, **Triage**, **Write**, **Maintain** or **Admin**; default **Write**) and click **Add**. Accounts get the role immediately ("diffy now has write access. We let them know."). An email address without an account gets an invitation; see [Invitations](/docs/accounts/invitations#add-people-to-a-repository).
9999 - Change a collaborator's role with the **Role** menu and **Save**, or click **Remove** and confirm.
100100
101101 The person gets an email when their access is granted, changed or removed, and an in-app notification when someone adds them with **Add people**. With the API:
102102
103103 ```sh
104-# Give octocat the triage role (GitHub's "pull" and "push" also work: they mean read and write)
105-curl -X PUT https://diffinery.com/api/v3/repos/acme/website/collaborators/octocat \
104+# Give diffy the triage role (GitHub's "pull" and "push" also work: they mean read and write)
105+curl -X PUT https://diffinery.com/api/v3/repos/acme/website/collaborators/diffy \
106106 -H "Authorization: Bearer dfy_..." \
107107 -H "Content-Type: application/json" \
108108 -d '{"permission": "triage"}'
109109
110-# Remove octocat
111-curl -X DELETE https://diffinery.com/api/v3/repos/acme/website/collaborators/octocat \
110+# Remove diffy
111+curl -X DELETE https://diffinery.com/api/v3/repos/acme/website/collaborators/diffy \
112112 -H "Authorization: Bearer dfy_..."
113113 ```
114114
modifiedapps/diffinery/docs/accounts/profile-and-preferences.md+6−6View file
@@ -29,7 +29,7 @@
2929
3030 | Field | Editable | Notes |
3131 | --- | --- | --- |
32-| **Username** | Yes | Your login, the owner part of your repository URLs (`https://diffinery.com/octocat/...`) and your `@mention` handle |
32+| **Username** | Yes | Your login, the owner part of your repository URLs (`https://diffinery.com/diffy/...`) and your `@mention` handle |
3333 | **Display name** | Yes | Optional. Shown on your profile page and in the settings sidebar, with your username under it, and returned as `name` by the API. |
3434 | **Email** | No | Your account's email address. Notification emails go here. It can't be changed in Settings. |
3535 | **Account type** | No | `user` for a person |
@@ -38,7 +38,7 @@
3838
3939 Change the username or display name and click **Save profile**. You see "Profile saved."
4040
41-Your public profile page is `https://diffinery.com/octocat`. It shows your picture, display name, username, your organizations and the repositories the viewer can see. On your own profile page there is an **Edit profile** button that opens **Settings → Profile**. Profile pages need the viewer to be signed in.
41+Your public profile page is `https://diffinery.com/diffy`. It shows your picture, display name, username, your organizations and the repositories the viewer can see. On your own profile page there is an **Edit profile** button that opens **Settings → Profile**. Profile pages need the viewer to be signed in.
4242
4343 ### Change your username
4444
@@ -141,7 +141,7 @@
141141 ```
142142
143143 ```json
144-{ "avatar_url": "https://diffinery.com/api/avatars/octocat?v=1760350000" }
144+{ "avatar_url": "https://diffinery.com/api/avatars/diffy?v=1760350000" }
145145 ```
146146
147147 The `v` value is the new picture's version. Upload an organization's picture:
@@ -159,7 +159,7 @@
159159 ```
160160
161161 ```json
162-{ "avatar_url": "https://diffinery.com/api/avatars/octocat" }
162+{ "avatar_url": "https://diffinery.com/api/avatars/diffy" }
163163 ```
164164
165165 The `diffinery api` CLI command sends text bodies only, so use `curl` (or another HTTP client) to upload a picture.
@@ -198,8 +198,8 @@
198198 | `v` | A picture version, as returned by the upload API. Pins the URL to that picture so it can be cached for a long time. | none |
199199
200200 ```sh
201-# The 64-pixel picture of octocat
202-curl -o octocat.webp "https://diffinery.com/api/avatars/octocat?s=64"
201+# The 64-pixel picture of diffy
202+curl -o diffy.webp "https://diffinery.com/api/avatars/diffy?s=64"
203203 ```
204204
205205 The response is `image/webp` for an uploaded picture, or `image/svg+xml` for initials. The URL needs no sign-in or token, so you can use it in `<img>` tags, README files and other tools. A name that doesn't exist also gets an initials picture, so the URL doesn't reveal which accounts exist.
modifiedapps/diffinery/docs/accounts/tokens.md+1−1View file
@@ -170,7 +170,7 @@
170170
171171 ```sh
172172 git clone https://diffinery.com/acme/website.git
173-# Username: octocat (anything works)
173+# Username: diffy (anything works)
174174 # Password: dfy_...
175175 ```
176176
modifiedapps/diffinery/docs/actions/environments.md+4−4View file
@@ -528,7 +528,7 @@
528528 "original_environment": "production",
529529 "environment": "production",
530530 "description": "Deploy 1.4.0",
531- "creator": { "login": "octocat", "type": "User" },
531+ "creator": { "login": "diffy", "type": "User" },
532532 "created_at": "2026-10-13T09:30:00Z",
533533 "updated_at": "2026-10-13T09:30:00Z",
534534 "statuses_url": "https://diffinery.com/api/v3/repos/acme/website/deployments/7/statuses",
@@ -610,7 +610,7 @@
610610 "id": 15,
611611 "node_id": "RGVwbG95bWVudFN0YXR1czphY21lL3dlYnNpdGUvMTU",
612612 "state": "success",
613- "creator": { "login": "octocat", "type": "User" },
613+ "creator": { "login": "diffy", "type": "User" },
614614 "description": "Deployed",
615615 "environment": "production",
616616 "target_url": "https://ci.example.com/builds/812",
@@ -676,7 +676,7 @@
676676 "created_at": "2026-10-13T09:30:00.000Z"
677677 },
678678 "repository": { "full_name": "acme/website" },
679- "sender": { "login": "octocat", "type": "User" }
679+ "sender": { "login": "diffy", "type": "User" }
680680 }
681681 ```
682682
@@ -700,7 +700,7 @@
700700 },
701701 "deployment": { "id": 7, "sha": "9fceb02d0ae598e95dc970b74767f19372d61af8", "ref": "main", "task": "deploy", "environment": "production" },
702702 "repository": { "full_name": "acme/website" },
703- "sender": { "login": "octocat", "type": "User" }
703+ "sender": { "login": "diffy", "type": "User" }
704704 }
705705 ```
706706
modifiedapps/diffinery/docs/actions/oidc.md+1−1View file
@@ -93,7 +93,7 @@
9393 | `workflow` | `Deploy` | The workflow's `name`, or its file path when it has none. |
9494 | `event_name` | `push` | The event that started the run. |
9595 | `run_id` | `01J9Z...` | Diffinery's run id (an opaque string, not a number). |
96-| `actor` | `octocat` | Who started the run. |
96+| `actor` | `diffy` | Who started the run. |
9797 | `job_workflow_ref` | `acme/website/.github/workflows/deploy.yml@refs/heads/main` | The run's top-level workflow file and ref. |
9898
9999 The token header is `{"alg": "ES256", "typ": "JWT", "kid": "..."}`.
modifiedapps/diffinery/docs/admin/site-administration.md+3−3View file
@@ -76,7 +76,7 @@
7676 - agents they own stop working, because an agent can never do more than its owner,
7777 - they get a "Your account was disabled" email.
7878
79-Their repositories, organizations and memberships stay as they are, but they can't be added to organizations or repositories while disabled ("octocat's account is disabled"). Set the status back to **Active** to enable the account; the person gets "Your account was enabled" and signs in with their passkey again. Their old tokens stay revoked, so they need to create new ones.
79+Their repositories, organizations and memberships stay as they are, but they can't be added to organizations or repositories while disabled ("diffy's account is disabled"). Set the status back to **Active** to enable the account; the person gets "Your account was enabled" and signs in with their passkey again. Their old tokens stay revoked, so they need to create new ones.
8080
8181 Every status change is recorded in the audit log as `user.active`, `user.pending` or `user.disabled`.
8282
@@ -91,8 +91,8 @@
9191 When someone loses their passkeys, a site administrator can give them a one-time link that adds a new passkey to their existing account.
9292
9393 1. In the **Users** table, click **Sign-in link** next to the person.
94-2. Confirm "Create a one-time link that adds a passkey to octocat? Only send it to them."
95-3. The page shows **Sign-in link for octocat** with the link and a copy button. Diffinery has already emailed it to the person ("Your one-time sign-in link"); you can also send it yourself through a channel you trust.
94+2. Confirm "Create a one-time link that adds a passkey to diffy? Only send it to them."
95+3. The page shows **Sign-in link for diffy** with the link and a copy button. Diffinery has already emailed it to the person ("Your one-time sign-in link"); you can also send it yourself through a channel you trust.
9696
9797 The person opens the link, creates a passkey and is signed in. See [Passkeys and sign-in](/docs/accounts/passkeys-and-sign-in#sign-in-link-from-an-administrator) for their side.
9898
modifiedapps/diffinery/docs/agents/overview.md+2−2View file
@@ -142,7 +142,7 @@
142142
143143 ### Commits
144144
145-Commits that Diffinery writes for an agent are stamped with an extra header naming the agent and its owner, `diffinery-agent review-bot on-behalf-of octocat`. This covers commits made through:
145+Commits that Diffinery writes for an agent are stamped with an extra header naming the agent and its owner, `diffinery-agent review-bot on-behalf-of diffy`. This covers commits made through:
146146
147147 - the `commit_files` MCP tool and `POST /repos/{owner}/{repo}/diffinery/commits`;
148148 - the contents API (`PUT` and `DELETE /repos/{owner}/{repo}/contents/{path}`);
@@ -162,7 +162,7 @@
162162 parent 51c0e2aa...
163163 author review-bot <review-bot@users.noreply.diffinery.com> 1791883964 +0000
164164 committer review-bot <review-bot@users.noreply.diffinery.com> 1791883964 +0000
165-diffinery-agent review-bot on-behalf-of octocat
165+diffinery-agent review-bot on-behalf-of diffy
166166
167167 Fix the Contact sales link
168168 ```
modifiedapps/diffinery/docs/collaboration/issues.md+9−9View file
@@ -72,7 +72,7 @@
7272 --title "Broken link on pricing page" \
7373 --body "The *Contact sales* link returns 404." \
7474 --label bug --label website \
75- --assignee octocat
75+ --assignee diffy
7676 ```
7777
7878 | Flag | Meaning |
@@ -93,7 +93,7 @@
9393 curl -X POST https://diffinery.com/api/v3/repos/acme/website/issues \
9494 -H "Authorization: Bearer dfy_..." \
9595 -H "Content-Type: application/json" \
96- -d '{"title": "Broken link on pricing page", "body": "The *Contact sales* link returns 404.", "labels": ["bug"], "assignees": ["octocat"]}'
96+ -d '{"title": "Broken link on pricing page", "body": "The *Contact sales* link returns 404.", "labels": ["bug"], "assignees": ["diffy"]}'
9797 ```
9898
9999 The response (`201 Created`) is GitHub's issue object: `id` and `number` (both the issue number), `title`, `body`, `state`, `state_reason`, `locked`, `active_lock_reason`, `user` (`login`, `id`, and `type` `User` or `Bot`), `labels` (label objects with `id`, `name`, `color`, `description`), `assignee` and `assignees` (user objects), `comments`, `reactions` (counts), `created_at`, `updated_at`, `closed_at`, `html_url` and API URLs such as `comments_url`, `events_url` and `timeline_url`. `assignee` (a single login) is accepted in place of `assignees`, and `labels` may be names or `{ "name": ... }` objects.
@@ -189,7 +189,7 @@
189189 An issue can have several assignees. Assigned people are notified and follow the thread from then on.
190190
191191 - **Web UI (triage or higher):** in the sidebar under **Assignees**, click **Edit assignees**, type logins separated by commas or spaces (a leading `@` is ignored, at most 10), and click **Save**. Leave the box empty to remove everyone.
192-- **CLI:** `diffinery issue create --assignee octocat`.
192+- **CLI:** `diffinery issue create --assignee diffy`.
193193 - **REST API, whole list:** send the complete list in `assignees` (or a single `assignee`; `"assignee": null` clears them) on `POST .../issues` or `PATCH .../issues/{number}`.
194194 - **REST API, add or remove (triage or higher):**
195195
@@ -197,7 +197,7 @@
197197 # Add assignees (returns the issue, 201)
198198 curl -X POST https://diffinery.com/api/v3/repos/acme/website/issues/12/assignees \
199199 -H "Authorization: Bearer dfy_..." -H "Content-Type: application/json" \
200- -d '{"assignees": ["octocat", "review-bot"]}'
200+ -d '{"assignees": ["diffy", "review-bot"]}'
201201
202202 # Remove assignees (returns the issue)
203203 curl -X DELETE https://diffinery.com/api/v3/repos/acme/website/issues/12/assignees \
@@ -409,13 +409,13 @@
409409 Filters are query parameters, so you can bookmark or share them:
410410
411411 ```text
412-https://diffinery.com/acme/website/issues?state=closed&label=bug&author=octocat&q=pricing
412+https://diffinery.com/acme/website/issues?state=closed&label=bug&author=diffy&q=pricing
413413 ```
414414
415415 ### List issues with the CLI
416416
417417 ```sh
418-diffinery issue list -R acme/website --state all --label bug --author octocat --search pricing --limit 50
418+diffinery issue list -R acme/website --state all --label bug --author diffy --search pricing --limit 50
419419 diffinery issue view 12
420420 ```
421421
@@ -433,7 +433,7 @@
433433
434434 ```sh
435435 curl -H "Authorization: Bearer dfy_..." \
436- "https://diffinery.com/api/v3/repos/acme/website/issues?state=all&labels=bug&creator=octocat&q=pricing&per_page=50&page=1"
436+ "https://diffinery.com/api/v3/repos/acme/website/issues?state=all&labels=bug&creator=diffy&q=pricing&per_page=50&page=1"
437437 ```
438438
439439 | Parameter | Meaning |
@@ -476,8 +476,8 @@
476476 | `is:locked`, `is:unlocked` | Locked conversations or not |
477477 | `label:bug`, `label:bug,ui` | Has these labels (all of them); `-label:` excludes |
478478 | `no:label`, `no:assignee` | Has no labels, or no assignees |
479-| `author:octocat`, `-author:review-bot` | Opened by, or not by, this login |
480-| `assignee:octocat` | Assigned to this login |
479+| `author:diffy`, `-author:review-bot` | Opened by, or not by, this login |
480+| `assignee:diffy` | Assigned to this login |
481481 | `head:fix-pricing-link`, `base:main` | Pull requests by head or base branch |
482482 | `in:title`, `in:body`, `in:comments` | Where words must appear (default: title and body); combine with commas |
483483 | `created:`, `updated:`, `closed:` | Date ranges: `>2026-09-01`, `>=`, `<`, `<=`, `2026-09-01..2026-09-30`, `2026-09-01..*`, or one day |
modifiedapps/diffinery/docs/collaboration/merge-queue.md+2−2View file
@@ -161,7 +161,7 @@
161161 "head_sha": "3f2a9c1e...",
162162 "merge_method": "squash",
163163 "delete_branch": true,
164- "enqueued_by": { "login": "octocat" },
164+ "enqueued_by": { "login": "diffy" },
165165 "enqueued_at": "2026-10-13T09:12:44.000Z",
166166 "merge_group": {
167167 "head_sha": "9be41d07...",
@@ -229,7 +229,7 @@
229229 | `main no longer uses a merge queue` | The merge queue was turned off for the branch. |
230230 | `the base branch main no longer exists` | The base branch was deleted. |
231231 | `the pull request was closed` | No comment is posted. |
232-| `octocat removed it from the queue` | Someone removed it by hand. No comment is posted. |
232+| `diffy removed it from the queue` | Someone removed it by hand. No comment is posted. |
233233
234234 When a pull request leaves, its merge group branch is deleted and its unfinished runs are cancelled with `Cancelled because its merge group was rebuilt or left the queue.` Fix the problem, wait for the pull request's own checks, and add it to the queue again.
235235
modifiedapps/diffinery/docs/collaboration/pull-requests.md+6−6View file
@@ -77,7 +77,7 @@
7777 --title "Fix the Contact sales link" \
7878 --intent "Point the pricing page's Contact sales link at /contact; no other behaviour changes." \
7979 --body "Fixes #12" \
80- --reviewer octocat
80+ --reviewer diffy
8181 ```
8282
8383 | Flag | Meaning |
@@ -105,7 +105,7 @@
105105 "body": "Fixes #12",
106106 "intent": "Point the pricing page'\''s Contact sales link at /contact; no other behaviour changes.",
107107 "draft": false,
108- "reviewers": ["octocat"]
108+ "reviewers": ["diffy"]
109109 }'
110110 ```
111111
@@ -327,7 +327,7 @@
327327 ```sh
328328 curl -X POST https://diffinery.com/api/v3/repos/acme/website/pulls/12/requested_reviewers \
329329 -H "Authorization: Bearer dfy_..." -H "Content-Type: application/json" \
330- -d '{"reviewers": ["octocat", "review-bot"]}'
330+ -d '{"reviewers": ["diffy", "review-bot"]}'
331331 ```
332332
333333 Requested reviewers are notified and appear in the sidebar's **Reviewers** list as `pending` until they submit a review. Logins aren't checked. Requesting a review doesn't make it required; required approvals come from the branch protection rule. `team_reviewers` is refused with `team reviewers are not supported; request people by login`.
@@ -457,7 +457,7 @@
457457 3. Leave **Delete fix-pricing-link after merge** ticked to delete the head branch, or untick it.
458458 4. Click **Merge pull request**.
459459
460-The timeline then shows `octocat merged commit abc1234 into main`.
460+The timeline then shows `diffy merged commit abc1234 into main`.
461461
462462 ### Merge with the CLI
463463
@@ -563,7 +563,7 @@
563563 | `pull request is a draft` | Drafts can't be merged. See [Drafts](#drafts). |
564564 | `merge conflicts in N file(s)` | Resolve the conflicts and push. See [Conflicts](#conflicts). |
565565 | `needs N more approving review(s)` | Get more approvals from people with write access. Agent approvals don't count. |
566-| `changes requested by octocat` | That reviewer must approve before merging. |
566+| `changes requested by diffy` | That reviewer must approve before merging. |
567567 | `required check 'CI / test' has not run` | No counted check run or status with that exact name was reported on the head commit. Check the workflow's trigger and the check name. Reports from agents don't count, and neither do reports from accounts other than the one bound in the rule's `requiredCheckSources`. |
568568 | `required check 'CI / test' is queued` (or `is in_progress`) | Wait for it to finish. A `pending` commit status shows as `is in_progress`. |
569569 | `required check 'CI / test' failure` (or another conclusion such as `cancelled`, `timed_out` or `action_required`) | The check didn't pass. Fix the code or re-run the workflow. |
@@ -646,7 +646,7 @@
646646 The **Pull requests** tab lists pull requests with the same filters as the issue list: open or closed, search, label and author. See [Issues](/docs/collaboration/issues#find-issues).
647647
648648 ```sh
649-diffinery pr list --state merged --author octocat --limit 20
649+diffinery pr list --state merged --author diffy --limit 20
650650 diffinery pr view 12 --comments
651651 diffinery pr diff 12 --name-only
652652 ```
modifiedapps/diffinery/docs/collaboration/releases.md+14−14View file
@@ -124,15 +124,15 @@
124124 "html_url": "https://diffinery.com/acme/website/releases/tag/v1.2.0",
125125 "id": 7,
126126 "author": {
127- "login": "octocat",
127+ "login": "diffy",
128128 "id": 7220136606554077,
129129 "node_id": "VXNlcjphMWIyYzNkNGU1ZjYwNzE4MjkzYTRiNWM2ZDdlOGY5MA",
130- "avatar_url": "https://diffinery.com/api/avatars/octocat",
130+ "avatar_url": "https://diffinery.com/api/avatars/diffy",
131131 "gravatar_id": "",
132- "url": "https://diffinery.com/api/v3/users/octocat",
133- "html_url": "https://diffinery.com/octocat",
134- "repos_url": "https://diffinery.com/api/v3/users/octocat/repos",
135- "organizations_url": "https://diffinery.com/api/v3/users/octocat/orgs",
132+ "url": "https://diffinery.com/api/v3/users/diffy",
133+ "html_url": "https://diffinery.com/diffy",
134+ "repos_url": "https://diffinery.com/api/v3/users/diffy/repos",
135+ "organizations_url": "https://diffinery.com/api/v3/users/diffy/orgs",
136136 "type": "User",
137137 "user_view_type": "public",
138138 "site_admin": false
@@ -150,7 +150,7 @@
150150 "assets": [],
151151 "tarball_url": "https://diffinery.com/api/v3/repos/acme/website/tarball/v1.2.0",
152152 "zipball_url": "https://diffinery.com/api/v3/repos/acme/website/zipball/v1.2.0",
153- "body": "## What's Changed\n* Fix broken footer links by @octocat in https://diffinery.com/acme/website/pull/41\n\n**Full Changelog**: https://diffinery.com/acme/website/compare/v1.1.0...v1.2.0",
153+ "body": "## What's Changed\n* Fix broken footer links by @diffy in https://diffinery.com/acme/website/pull/41\n\n**Full Changelog**: https://diffinery.com/acme/website/compare/v1.1.0...v1.2.0",
154154 "reactions": { "url": "https://diffinery.com/api/v3/repos/acme/website/releases/7/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "confused": 0, "heart": 0, "hooray": 0, "rocket": 0, "eyes": 0 },
155155 "latest": true
156156 }
@@ -253,7 +253,7 @@
253253 ```json
254254 {
255255 "name": "v1.2.0",
256- "body": "## What's Changed\n### New Features\n* Add dark mode by @octocat in https://diffinery.com/acme/website/pull/40\n\n### Bug Fixes\n* Fix broken footer links by @octocat in https://diffinery.com/acme/website/pull/41\n\n**Full Changelog**: https://diffinery.com/acme/website/compare/v1.1.0...v1.2.0"
256+ "body": "## What's Changed\n### New Features\n* Add dark mode by @diffy in https://diffinery.com/acme/website/pull/40\n\n### Bug Fixes\n* Fix broken footer links by @diffy in https://diffinery.com/acme/website/pull/41\n\n**Full Changelog**: https://diffinery.com/acme/website/compare/v1.1.0...v1.2.0"
257257 }
258258 ```
259259
@@ -334,15 +334,15 @@
334334 "name": "website-linux-amd64.tar.gz",
335335 "label": "Linux build",
336336 "uploader": {
337- "login": "octocat",
337+ "login": "diffy",
338338 "id": 7220136606554077,
339339 "node_id": "VXNlcjphMWIyYzNkNGU1ZjYwNzE4MjkzYTRiNWM2ZDdlOGY5MA",
340- "avatar_url": "https://diffinery.com/api/avatars/octocat",
340+ "avatar_url": "https://diffinery.com/api/avatars/diffy",
341341 "gravatar_id": "",
342- "url": "https://diffinery.com/api/v3/users/octocat",
343- "html_url": "https://diffinery.com/octocat",
344- "repos_url": "https://diffinery.com/api/v3/users/octocat/repos",
345- "organizations_url": "https://diffinery.com/api/v3/users/octocat/orgs",
342+ "url": "https://diffinery.com/api/v3/users/diffy",
343+ "html_url": "https://diffinery.com/diffy",
344+ "repos_url": "https://diffinery.com/api/v3/users/diffy/repos",
345+ "organizations_url": "https://diffinery.com/api/v3/users/diffy/orgs",
346346 "type": "User",
347347 "user_view_type": "public",
348348 "site_admin": false
modifiedapps/diffinery/docs/concepts.md+1−1View file
@@ -7,7 +7,7 @@
77
88 ## Accounts
99
10-Every action on Diffinery is taken by an account. There are three kinds: users, organizations and agents. All three share one namespace, so `https://diffinery.com/octocat`, `https://diffinery.com/acme` and `https://diffinery.com/review-bot` are all account pages, and repositories live under users and organizations.
10+Every action on Diffinery is taken by an account. There are three kinds: users, organizations and agents. All three share one namespace, so `https://diffinery.com/diffy`, `https://diffinery.com/acme` and `https://diffinery.com/review-bot` are all account pages, and repositories live under users and organizations.
1111
1212 ### Users
1313
modifiedapps/diffinery/docs/migrate-from-github.md+2−2View file
@@ -57,12 +57,12 @@
5757 Everything created on Diffinery is created by you (the token's account), with new timestamps. Each issue, pull request and comment starts with an attribution line that names the original author and date and links back to GitHub:
5858
5959 ```text
60-> Imported from GitHub issue [#12](https://github.com/acme/website/issues/12) by @octocat on 2026-03-01
60+> Imported from GitHub issue [#12](https://github.com/acme/website/issues/12) by @diffy on 2026-03-01
6161
6262 The original description follows here.
6363 ```
6464
65-Comments start with `> Imported from GitHub: comment by @octocat on 2026-03-02`.
65+Comments start with `> Imported from GitHub: comment by @diffy on 2026-03-02`.
6666
6767 ### What it doesn't copy
6868
modifiedapps/diffinery/docs/packages/container-registry.md+10−10View file
@@ -40,7 +40,7 @@
4040 A token restricted to some repositories only reaches packages linked to one of those repositories, plus public packages, which anyone can pull.
4141
4242 ```sh
43-echo "$DIFFINERY_TOKEN" | docker login diffinery.com -u octocat --password-stdin
43+echo "$DIFFINERY_TOKEN" | docker login diffinery.com -u diffy --password-stdin
4444 ```
4545
4646 ```text
@@ -50,8 +50,8 @@
5050 The same works with other clients:
5151
5252 ```sh
53-echo "$DIFFINERY_TOKEN" | podman login diffinery.com -u octocat --password-stdin
54-crane auth login diffinery.com -u octocat -p "$DIFFINERY_TOKEN"
53+echo "$DIFFINERY_TOKEN" | podman login diffinery.com -u diffy --password-stdin
54+crane auth login diffinery.com -u diffy -p "$DIFFINERY_TOKEN"
5555 ```
5656
5757 Without credentials, the registry answers `401 UNAUTHORIZED: sign in with a Diffinery token: docker login diffinery.com` on `/v2/`. Pulling a public package doesn't need a sign-in.
@@ -365,10 +365,10 @@
365365
366366 ```sh
367367 # Remove one tag; the version stays, untagged
368-curl -X DELETE -u octocat:dfy_... https://diffinery.com/v2/acme/website/manifests/1.4.0
368+curl -X DELETE -u diffy:dfy_... https://diffinery.com/v2/acme/website/manifests/1.4.0
369369
370370 # Delete a version and every tag pointing at it
371-curl -X DELETE -u octocat:dfy_... https://diffinery.com/v2/acme/website/manifests/sha256:4f9a...
371+curl -X DELETE -u diffy:dfy_... https://diffinery.com/v2/acme/website/manifests/sha256:4f9a...
372372 ```
373373
374374 Both return `202 Accepted`. Tools such as `crane delete` and `regctl` use these calls.
@@ -442,7 +442,7 @@
442442 "media_type": "application/vnd.oci.image.index.v1+json",
443443 "size": 48213377,
444444 "platforms": ["linux/amd64", "linux/arm64"],
445- "pushed_by": "octocat",
445+ "pushed_by": "diffy",
446446 "metadata": { "package_type": "container", "container": { "tags": ["1.4.0", "latest"] } }
447447 }
448448 ```
@@ -487,7 +487,7 @@
487487 ```sh
488488 kubectl create secret docker-registry diffinery \
489489 --docker-server=diffinery.com \
490- --docker-username=octocat \
490+ --docker-username=diffy \
491491 --docker-password=dfy_...
492492 ```
493493
@@ -517,8 +517,8 @@
517517 To copy images with all their platforms, use `crane copy` from a machine signed in to both registries. This works when every layer is under 100 MB:
518518
519519 ```sh
520-crane auth login ghcr.io -u octocat -p "$GITHUB_PAT"
521-crane auth login diffinery.com -u octocat -p "$DIFFINERY_TOKEN"
520+crane auth login ghcr.io -u diffy -p "$GITHUB_PAT"
521+crane auth login diffinery.com -u diffy -p "$DIFFINERY_TOKEN"
522522 crane copy ghcr.io/acme/website:1.4.0 diffinery.com/acme/website:1.4.0
523523 ```
524524
@@ -539,7 +539,7 @@
539539 permissions:
540540 packages: write
541541 steps:
542- - run: echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u octocat --password-stdin
542+ - run: echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u diffy --password-stdin
543543 - run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login diffinery.com -u "${{ github.actor }}" --password-stdin
544544 - run: |
545545 docker pull "ghcr.io/acme/website:${{ inputs.tag }}"
modifiedapps/diffinery/docs/quickstart.md+2−2View file
@@ -5,7 +5,7 @@
55
66 This guide takes you from an invite email to a repository with code, a passing workflow, a merged pull request, a first release and an AI agent connected over MCP. It takes about 15 minutes. Each step shows the web UI and, where it exists, the `diffinery` CLI and the REST API.
77
8-The examples use the organization `acme`, the repository `acme/website`, the user `octocat` and the agent `review-bot`. Replace them with your own names.
8+The examples use the organization `acme`, the repository `acme/website`, the user `diffy` and the agent `review-bot`. Replace them with your own names.
99
1010 ## What you need
1111
@@ -56,7 +56,7 @@
5656
5757 ```sh
5858 diffinery login # paste the dfy_ token when asked
59-diffinery whoami # prints octocat
59+diffinery whoami # prints diffy
6060 diffinery auth setup-git # git clone/fetch/push to diffinery.com now use the token
6161 ```
6262
modifiedapps/diffinery/docs/reference/rest-api.md+4−4View file
@@ -113,13 +113,13 @@
113113 | --- | --- | --- |
114114 | `Bearer` | `Authorization: Bearer dfy_...` | curl, fetch, MCP clients, the Diffinery CLI |
115115 | `token` | `Authorization: token dfy_...` | Octokit and other GitHub libraries |
116-| `Basic` | `Authorization: Basic base64(octocat:dfy_...)` | git, `curl -u`, Docker |
116+| `Basic` | `Authorization: Basic base64(diffy:dfy_...)` | git, `curl -u`, Docker |
117117
118118 With `Basic`, Diffinery takes the password as the token and ignores the username, so any username works (`x-token`, your login, anything). If the password is empty, the username is used as the token.
119119
120120 ```sh
121121 curl -H "Authorization: Bearer dfy_..." https://diffinery.com/api/v3/user
122-curl -u octocat:dfy_... https://diffinery.com/api/v3/user
122+curl -u diffy:dfy_... https://diffinery.com/api/v3/user
123123 ```
124124
125125 Inside a workflow job, the job's `GITHUB_TOKEN` can read its own repository through the API, with the read role.
@@ -516,8 +516,8 @@
516516 | `label:bug` | Has this label. `label:a,b` and repeated `label:` qualifiers require every label. |
517517 | `-label:wontfix` | Doesn't have this label |
518518 | `no:label`, `no:assignee` | Has no labels, or no assignee |
519-| `author:octocat`, `-author:octocat` | Opened, or not opened, by this login |
520-| `assignee:octocat` | Assigned to this login |
519+| `author:diffy`, `-author:diffy` | Opened, or not opened, by this login |
520+| `assignee:diffy` | Assigned to this login |
521521 | `head:branch`, `base:branch` | Pull requests from or into this branch |
522522 | `in:title`, `in:body`, `in:comments` | Where words must match (default: title and body); combine as `in:title,body` |
523523 | `created:`, `updated:`, `closed:` | Dates: `2026-10-01`, `>2026-10-01`, `>=`, `<`, `<=`, `2026-09-01..2026-09-30`, `2026-09-01..*` |
modifiedapps/diffinery/docs/reference/webhook-events.md+27−27View file
@@ -62,13 +62,13 @@
6262 A person:
6363
6464 ```json
65-{ "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
65+{ "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
6666 ```
6767
6868 An agent, with the login of the person or organization it acts for:
6969
7070 ```json
71-{ "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "octocat" }
71+{ "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "diffy" }
7272 ```
7373
7474 | Field | Description |
@@ -114,7 +114,7 @@
114114 "html_url": "https://diffinery.com/acme/website",
115115 "clone_url": "https://diffinery.com/acme/website.git"
116116 },
117- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
117+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
118118 }
119119 ```
120120
@@ -130,7 +130,7 @@
130130 "deleted": false,
131131 "at": "2026-10-13T09:31:12.000Z",
132132 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
133- "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "octocat" }
133+ "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "diffy" }
134134 }
135135 ```
136136
@@ -182,7 +182,7 @@
182182 "baseRef": "main",
183183 "at": "2026-10-13T09:32:40.000Z",
184184 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
185- "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "octocat" },
185+ "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "diffy" },
186186 "pull_request": {
187187 "number": 42,
188188 "html_url": "https://diffinery.com/acme/website/pull/42",
@@ -204,7 +204,7 @@
204204 "baseRef": "main",
205205 "at": "2026-10-13T10:05:11.000Z",
206206 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
207- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" },
207+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" },
208208 "pull_request": {
209209 "number": 42,
210210 "html_url": "https://diffinery.com/acme/website/pull/42",
@@ -227,9 +227,9 @@
227227 "headSha": "2b7e9d4c1a3f5e7d9b0c2a4e6f8d0b1c3e5a7f9d",
228228 "baseRef": "main",
229229 "at": "2026-10-13T09:33:05.000Z",
230- "reviewers": ["octocat"],
230+ "reviewers": ["diffy"],
231231 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
232- "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "octocat" },
232+ "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "diffy" },
233233 "pull_request": {
234234 "number": 42,
235235 "html_url": "https://diffinery.com/acme/website/pull/42",
@@ -240,7 +240,7 @@
240240 }
241241 ```
242242
243-The `assigned` payload has the same shape with `"assignees": ["octocat"]` instead of `reviewers`.
243+The `assigned` payload has the same shape with `"assignees": ["diffy"]` instead of `reviewers`.
244244
245245 Ready for review (`edited` and `converted_to_draft` look the same apart from `action`):
246246
@@ -253,7 +253,7 @@
253253 "baseRef": "main",
254254 "at": "2026-10-13T09:45:10.000Z",
255255 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
256- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" },
256+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" },
257257 "pull_request": {
258258 "number": 42,
259259 "html_url": "https://diffinery.com/acme/website/pull/42",
@@ -288,7 +288,7 @@
288288 "state": "APPROVED",
289289 "at": "2026-10-13T09:50:00.000Z",
290290 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
291- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
291+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
292292 }
293293 ```
294294
@@ -321,7 +321,7 @@
321321 "number": 12,
322322 "at": "2026-10-13T08:15:00.000Z",
323323 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
324- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" },
324+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" },
325325 "issue": { "number": 12, "html_url": "https://diffinery.com/acme/website/issues/12" }
326326 }
327327 ```
@@ -333,7 +333,7 @@
333333 "at": "2026-10-13T08:20:00.000Z",
334334 "assignees": ["review-bot"],
335335 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
336- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" },
336+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" },
337337 "issue": { "number": 12, "html_url": "https://diffinery.com/acme/website/issues/12" }
338338 }
339339 ```
@@ -364,7 +364,7 @@
364364 "commentId": "3e2d1c0b9a8f4e7d6c5b4a3f2e1d0c9b",
365365 "at": "2026-10-13T09:40:00.000Z",
366366 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
367- "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "octocat" },
367+ "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "diffy" },
368368 "issue": { "number": 42, "html_url": "https://diffinery.com/acme/website/issues/42" }
369369 }
370370 ```
@@ -394,7 +394,7 @@
394394 "conclusion": "success",
395395 "at": "2026-10-13T09:36:21.000Z",
396396 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
397- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
397+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
398398 }
399399 ```
400400
@@ -433,15 +433,15 @@
433433 "html_url": "https://diffinery.com/acme/website/releases/tag/v1.2.0",
434434 "id": 7,
435435 "author": {
436- "login": "octocat",
436+ "login": "diffy",
437437 "id": 7220136606554077,
438438 "node_id": "VXNlcjphMWIyYzNkNGU1ZjYwNzE4MjkzYTRiNWM2ZDdlOGY5MA",
439- "avatar_url": "https://diffinery.com/api/avatars/octocat",
439+ "avatar_url": "https://diffinery.com/api/avatars/diffy",
440440 "gravatar_id": "",
441- "url": "https://diffinery.com/api/v3/users/octocat",
442- "html_url": "https://diffinery.com/octocat",
443- "repos_url": "https://diffinery.com/api/v3/users/octocat/repos",
444- "organizations_url": "https://diffinery.com/api/v3/users/octocat/orgs",
441+ "url": "https://diffinery.com/api/v3/users/diffy",
442+ "html_url": "https://diffinery.com/diffy",
443+ "repos_url": "https://diffinery.com/api/v3/users/diffy/repos",
444+ "organizations_url": "https://diffinery.com/api/v3/users/diffy/orgs",
445445 "type": "User",
446446 "user_view_type": "public",
447447 "site_admin": false
@@ -459,12 +459,12 @@
459459 "assets": [],
460460 "tarball_url": "https://diffinery.com/api/v3/repos/acme/website/tarball/v1.2.0",
461461 "zipball_url": "https://diffinery.com/api/v3/repos/acme/website/zipball/v1.2.0",
462- "body": "## What's Changed\n* Fix broken footer links by @octocat in https://diffinery.com/acme/website/pull/41\n\n**Full Changelog**: https://diffinery.com/acme/website/compare/v1.1.0...v1.2.0",
462+ "body": "## What's Changed\n* Fix broken footer links by @diffy in https://diffinery.com/acme/website/pull/41\n\n**Full Changelog**: https://diffinery.com/acme/website/compare/v1.1.0...v1.2.0",
463463 "reactions": { "url": "https://diffinery.com/api/v3/repos/acme/website/releases/7/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "confused": 0, "heart": 0, "hooray": 0, "rocket": 0, "eyes": 0 },
464464 "latest": true
465465 },
466466 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
467- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
467+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
468468 }
469469 ```
470470
@@ -541,7 +541,7 @@
541541 "created_at": "2026-10-13T10:05:00.000Z"
542542 },
543543 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
544- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
544+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
545545 }
546546 ```
547547
@@ -591,7 +591,7 @@
591591 "environment": "production"
592592 },
593593 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
594- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
594+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
595595 }
596596 ```
597597
@@ -617,7 +617,7 @@
617617 "branch": "main",
618618 "client_payload": { "version": "1.2.0" },
619619 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
620- "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "octocat" }
620+ "sender": { "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "login": "review-bot", "type": "Bot", "on_behalf_of": "diffy" }
621621 }
622622 ```
623623
@@ -639,7 +639,7 @@
639639 "inputs": { "environment": "staging", "version": "1.2.0", "dry-run": false },
640640 "at": "2026-10-13T10:15:00.000Z",
641641 "repository": { "id": 6628874657374920, "node_id": "UmVwb3NpdG9yeTo1YzBlOGI3ZjJkMWE0ZTNiOWY2YTdjOGQ5ZTBmMWEyYg", "name": "website", "full_name": "acme/website", "owner": { "login": "acme" }, "html_url": "https://diffinery.com/acme/website", "clone_url": "https://diffinery.com/acme/website.git" },
642- "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "octocat", "type": "User" }
642+ "sender": { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "login": "diffy", "type": "User" }
643643 }
644644 ```
645645
modifiedapps/diffinery/docs/repositories/overview.md+6−6View file
@@ -11,7 +11,7 @@
1111
1212 | Owner | Who can create repositories there | Who gets access automatically |
1313 | --- | --- | --- |
14-| Your user account (`octocat/notes`) | Only you (and site administrators) | You are **admin**. Nobody else, unless you add collaborators or make it public. |
14+| Your user account (`diffy/notes`) | Only you (and site administrators) | You are **admin**. Nobody else, unless you add collaborators or make it public. |
1515 | An organization (`acme/website`) | Any member of the organization | Organization **members** get **write**. Organization **owners** and **admins** get **admin**. |
1616
1717 You can add collaborators to either kind for extra or narrower access (see [Collaborators and roles](#collaborators-and-roles)). Organizations have no teams: access in an organization comes from the member's organization role plus any collaborator role on the repository. See [Organizations](/docs/accounts/organizations).
@@ -184,7 +184,7 @@
184184
185185 Open **Settings → Collaborators** and use the **Add people** form:
186186
187-1. In **Username or email**, enter a person's or agent's username (for example `octocat` or `review-bot`, with or without a leading `@`) or an email address.
187+1. In **Username or email**, enter a person's or agent's username (for example `diffy` or `review-bot`, with or without a leading `@`) or an email address.
188188 2. Pick a **Role** (**Read**, **Triage**, **Write**, **Maintain** or **Admin**; the default is **Write**).
189189 3. Click **Add**.
190190
@@ -192,7 +192,7 @@
192192
193193 | You entered | Result |
194194 | --- | --- |
195-| The username of a person or agent | They get the role right away, a notification on Diffinery and an email. The page confirms with "octocat now has write access. We let them know." |
195+| The username of a person or agent | They get the role right away, a notification on Diffinery and an email. The page confirms with "diffy now has write access. We let them know." |
196196 | The email address of someone who has an account | Same as their username. |
197197 | An email address nobody uses yet | Diffinery emails an invitation and shows the link once ("Invitation sent to ..."), so you can also send it yourself. The link works once and expires in 14 days. Opening it creates the person's account and passkey and gives them the role on this repository. See [Invitations](/docs/accounts/invitations). |
198198
@@ -218,12 +218,12 @@
218218 curl https://diffinery.com/api/v3/repos/acme/website/collaborators -H "Authorization: Bearer dfy_..."
219219
220220 # Add or change a collaborator
221-curl -X PUT https://diffinery.com/api/v3/repos/acme/website/collaborators/octocat \
221+curl -X PUT https://diffinery.com/api/v3/repos/acme/website/collaborators/diffy \
222222 -H "Authorization: Bearer dfy_..." -H "content-type: application/json" \
223223 -d '{"permission": "maintain"}'
224224
225225 # Remove a collaborator
226-curl -X DELETE https://diffinery.com/api/v3/repos/acme/website/collaborators/octocat -H "Authorization: Bearer dfy_..."
226+curl -X DELETE https://diffinery.com/api/v3/repos/acme/website/collaborators/diffy -H "Authorization: Bearer dfy_..."
227227 ```
228228
229229 `permission` accepts `read`, `triage`, `write`, `maintain` or `admin`, and GitHub's `pull` (read) and `push` (write). It defaults to `write`. The list response gives each account's `role_name`.
@@ -296,7 +296,7 @@
296296 | Task | Web | CLI | API |
297297 | --- | --- | --- | --- |
298298 | Repositories you can see | Your dashboard | `diffinery repo list` | `GET /api/v3/user/repos` |
299-| One owner's repositories | `https://diffinery.com/acme` | `diffinery repo list --owner acme` | `GET /api/v3/orgs/acme/repos` or `GET /api/v3/users/octocat/repos` |
299+| One owner's repositories | `https://diffinery.com/acme` | `diffinery repo list --owner acme` | `GET /api/v3/orgs/acme/repos` or `GET /api/v3/users/diffy/repos` |
300300 | One repository | `https://diffinery.com/acme/website` | `diffinery repo view acme/website` | `GET /api/v3/repos/acme/website` |
301301
302302 `GET /api/v3/repos/{owner}/{repo}` also returns your access as `permissions` (GitHub's `admin`, `maintain`, `push`, `triage` and `pull` booleans plus Diffinery's `role`) and `stats` (objects, stored bytes, refs, open issues and open pull requests). The repository page's **About** box shows the same numbers with the last push time.
modifiedapps/diffinery/docs/security/audit-log.md+1−1View file
@@ -137,7 +137,7 @@
137137
138138 ## Agents and on-behalf-of
139139
140-When an agent acts, the entry records the agent as the actor and the agent's owner in `on_behalf_of`, so the page reads, for example, `review-bot for octocat`. This applies to pushes, merges, push protection decisions and settings changes made with the agent's token. (Agents can never bypass branch protection on a merge, so `pull_request.merge_bypassed` always names a person.) See [Agents](/docs/agents/overview).
140+When an agent acts, the entry records the agent as the actor and the agent's owner in `on_behalf_of`, so the page reads, for example, `review-bot for diffy`. This applies to pushes, merges, push protection decisions and settings changes made with the agent's token. (Agents can never bypass branch protection on a merge, so `pull_request.merge_bypassed` always names a person.) See [Agents](/docs/agents/overview).
141141
142142 ## Security emails
143143
modifiedapps/diffinery/docs/security/push-protection.md+1−1View file
@@ -175,7 +175,7 @@
175175
176176 ### What a bypass does
177177
178-- The push continues and the output shows `Push protection bypassed by octocat: <reason>`, followed by the findings (up to 10).
178+- The push continues and the output shows `Push protection bypassed by diffy: <reason>`, followed by the findings (up to 10).
179179 - The bypass skips only the secret scan. Branch protection still applies to every ref.
180180 - It is recorded in the [audit log](/docs/security/audit-log) as `push.secret_bypassed`, with the detected types, your reason and the refs.
181181 - An email with the subject `[acme/website] Push protection was bypassed` goes to you and to the repository's admins (the owner or the organization's owners and admins, plus admin collaborators who are people). It names who pushed, the types found, the reason and the refs. You cannot turn this email off.
modifiedapps/diffinery/src/docs/reference.ts+1−1View file
@@ -159,7 +159,7 @@
159159 action: "Action to take.",
160160 };
161161
162-const EXAMPLE: Record<string, string> = { owner: "acme", repo: "website", org: "acme", login: "octocat", number: "42", branch: "main", ref: "main", path: "README.md", spec: "main...feature", type: "container", name: "website", workflow: "ci.yml", action: "exec" };
162+const EXAMPLE: Record<string, string> = { owner: "acme", repo: "website", org: "acme", login: "diffy", number: "42", branch: "main", ref: "main", path: "README.md", spec: "main...feature", type: "container", name: "website", workflow: "ci.yml", action: "exec" };
163163
164164 function curl(origin: string, op: ApiOperation): string {
165165 const url = `${origin}${API_BASE}${op.path === "/" ? "" : op.path.replace(/\{(\w+)\}/g, (_, p: string) => EXAMPLE[p] ?? (p === "id" ? "1" : p))}`;
modifiedapps/diffinery/src/mail/samples.ts+2−2View file
@@ -14,7 +14,7 @@
1414 kind: "pull",
1515 title: "Cache build artifacts between workflow runs",
1616 event: "opened",
17- actor: "octo-dev",
17+ actor: "diffy-dev",
1818 url: `${pub}/${repo}/pull/42`,
1919 base: "main",
2020 head: "cache-artifacts",
@@ -74,7 +74,7 @@
7474 item("welcome", "Welcome", { kind: "welcome", reason: "account", data: { login: me } }),
7575 item("signin-link", "Sign-in link", { kind: "signin_link", reason: "account", data: { url: `${pub}/signin/sample`, admin: "admin", expiresAt: new Date(Date.now() + 86400_000).toISOString() } }),
7676 item("access-request", "Access request", { kind: "access_request", reason: "admin", data: { email: "newcomer@example.com", login: "newcomer", note: "I'm joining the platform team next week." } }),
77- item("org-member", "Organization membership", { kind: "org_membership", reason: "account", data: { org: repo.split("/")[0]!, role: "admin", previous: "member", by: "octo-dev" } }),
77+ item("org-member", "Organization membership", { kind: "org_membership", reason: "account", data: { org: repo.split("/")[0]!, role: "admin", previous: "member", by: "diffy-dev" } }),
7878 item("repo-access", "Repository access", { kind: "repo_access", reason: "account", data: { repo, role: "write", previous: null } }),
7979 item("repo-created", "Repository created", { kind: "repo_created", reason: "your_activity", data: { repo, creator: me, visibility: "private", defaultBranch: "main", description: "Marketing site" } }),
8080 item("repo-deleted", "Repository deleted", { kind: "repo_deleted", reason: "admin", data: { repo, actor: "kim" } }),
modifiedapps/diffinery/src/web/account.tsx+1−1View file
@@ -1721,7 +1721,7 @@
17211721 <div class="formrow">
17221722 <div class="field grow">
17231723 <label for="who">Username or email</label>
1724- <input id="who" name="who" type="text" required autocomplete="off" spellcheck={false} placeholder="octocat or name@example.com" />
1724+ <input id="who" name="who" type="text" required autocomplete="off" spellcheck={false} placeholder="diffy or name@example.com" />
17251725 </div>
17261726 <div class="field">
17271727 <label for="role">Role</label>
modifiedapps/diffinery/src/web/imports.tsx+3−3View file
@@ -52,8 +52,8 @@
5252 </div>
5353 <div class="field">
5454 <label for="source">GitHub repository, or organization/user</label>
55- <input id="source" name="source" type="text" value={values.source} placeholder="octocat/hello-world or octocat" autofocus autocomplete="off" required />
56- <p class="muted small m0">Example: a URL like https://github.com/octocat/hello-world, or just octocat/hello-world. For a whole account, its name.</p>
55+ <input id="source" name="source" type="text" value={values.source} placeholder="diffy/hello-world or diffy" autofocus autocomplete="off" required />
56+ <p class="muted small m0">Example: a URL like https://github.com/diffy/hello-world, or just diffy/hello-world. For a whole account, its name.</p>
5757 </div>
5858 <div class="row" style="align-items:flex-end;gap:10px">
5959 <div class="field" style="min-width:200px">
@@ -581,7 +581,7 @@
581581 <input type="hidden" name="api_url" value={challenge.apiUrl} />
582582 <div class="field">
583583 <label for="llogin">Your GitHub username on {challenge.host}</label>
584- <input id="llogin" name="login" type="text" autocomplete="off" placeholder="octocat" required />
584+ <input id="llogin" name="login" type="text" autocomplete="off" placeholder="diffy" required />
585585 </div>
586586 <button class="btn primary">Verify and link</button>
587587 </Form>
modifiedapps/diffinery/src/web/repo-settings.tsx+1−1View file
@@ -289,7 +289,7 @@
289289 <div class="formrow">
290290 <div class="field grow">
291291 <label for="who">Username or email</label>
292- <input id="who" name="who" type="text" required autocomplete="off" spellcheck={false} placeholder="octocat, review-bot or name@example.com" />
292+ <input id="who" name="who" type="text" required autocomplete="off" spellcheck={false} placeholder="diffy, review-bot or name@example.com" />
293293 </div>
294294 <div class="field">
295295 <label for="role">Role</label>
modifiedapps/diffinery/test/e2e/e2e.test.mjs+3−3View file
@@ -1520,8 +1520,8 @@
15201520 const full = await gh.rest.git.getTree({ ...R, tree_sha: tree.data.sha, recursive: "true" });
15211521 assert.ok(full.data.tree.some((e) => e.path === "gitdata/hello.txt" && e.type === "blob"));
15221522 assert.ok(full.data.tree.some((e) => e.path === "src/main.ts"));
1523- const commit = await gh.rest.git.createCommit({ ...R, message: "Commit from the git data API", tree: tree.data.sha, parents: [headSha], author: { name: "Octo Cat", email: "octo@example.com", date: "2024-05-06T07:08:09Z" } });
1524- assert.equal(commit.data.author.name, "Octo Cat");
1523+ const commit = await gh.rest.git.createCommit({ ...R, message: "Commit from the git data API", tree: tree.data.sha, parents: [headSha], author: { name: "Diffy", email: "diffy@example.com", date: "2024-05-06T07:08:09Z" } });
1524+ assert.equal(commit.data.author.name, "Diffy");
15251525 assert.deepEqual(commit.data.parents.map((p) => p.sha), [headSha]);
15261526 const ref = await gh.rest.git.createRef({ ...R, ref: "refs/heads/feature", sha: commit.data.sha });
15271527 assert.equal(ref.data.ref, "refs/heads/feature");
@@ -1529,7 +1529,7 @@
15291529 await assert.rejects(gh.rest.git.createRef({ ...R, ref: "refs/heads/feature", sha: commit.data.sha }), (e) => e.status === 422);
15301530 const matching = await gh.rest.git.listMatchingRefs({ ...R, ref: "heads/f" });
15311531 assert.deepEqual(matching.data.map((x) => x.ref), ["refs/heads/feature"]);
1532- const tag = await gh.rest.git.createTag({ ...R, tag: "v0.1.0", message: "Annotated tag", object: commit.data.sha, type: "commit", tagger: { name: "Octo Cat", email: "octo@example.com", date: "2024-05-06T07:08:09Z" } });
1532+ const tag = await gh.rest.git.createTag({ ...R, tag: "v0.1.0", message: "Annotated tag", object: commit.data.sha, type: "commit", tagger: { name: "Diffy", email: "diffy@example.com", date: "2024-05-06T07:08:09Z" } });
15331533 await gh.rest.git.createRef({ ...R, ref: "refs/tags/v0.1.0", sha: tag.data.sha });
15341534 assert.equal((await gh.rest.git.getTag({ ...R, tag_sha: tag.data.sha })).data.object.sha, commit.data.sha);
15351535 assert.equal((await gh.rest.git.getRef({ ...R, ref: "tags/v0.1.0" })).data.object.type, "tag");
modifiedapps/diffinery/test/unit/email.test.ts+6−6View file
@@ -10,7 +10,7 @@
1010
1111 const PUB = "https://diffinery.example";
1212 const env = { PUBLIC_URL: PUB, MASTER_KEY: "test-master-key", MAIL_FROM: "notifications@diffinery.example" } as unknown as Env;
13-const samples = sampleJobs(PUB, { accountId: "acc1" }, "octocat");
13+const samples = sampleJobs(PUB, { accountId: "acc1" }, "diffy");
1414
1515 describe("email templates", () => {
1616 it("has a sample for every kind of email", () => {
@@ -21,7 +21,7 @@
2121 });
2222
2323 it.each(samples.map((s) => [s.id, s.job] as const))("renders %s as HTML and plain text", async (_id, job) => {
24- const msg = await buildMessage(env, job, { email: "octocat@example.com", name: "Octo Cat", login: "octocat", accountId: "acc1" });
24+ const msg = await buildMessage(env, job, { email: "diffy@example.com", name: "Diffy", login: "diffy", accountId: "acc1" });
2525 expect(msg.subject.length).toBeGreaterThan(5);
2626 expect(msg.subject).not.toMatch(/[\r\n]/);
2727 expect(msg.html).toMatch(/^<!doctype html>/i);
@@ -44,8 +44,8 @@
4444 it("threads issue and pull request emails like GitHub", async () => {
4545 const opened = samples.find((s) => s.id === "pr-opened")!.job;
4646 const comment = samples.find((s) => s.id === "comment")!.job;
47- const a = await buildMessage(env, opened, { email: "a@example.com", accountId: "acc1", login: "octocat" });
48- const b = await buildMessage(env, comment, { email: "a@example.com", accountId: "acc1", login: "octocat" });
47+ const a = await buildMessage(env, opened, { email: "a@example.com", accountId: "acc1", login: "diffy" });
48+ const b = await buildMessage(env, comment, { email: "a@example.com", accountId: "acc1", login: "diffy" });
4949 expect(a.subject).toBe("[acme/website] Cache build artifacts between workflow runs (PR #42)");
5050 expect(b.subject).toBe("Re: [acme/website] Cache build artifacts between workflow runs (PR #42)");
5151 expect(a.headers.References).toBe(b.headers.References);
@@ -57,7 +57,7 @@
5757 it("escapes what people write", () => {
5858 const job = { ...samples.find((s) => s.id === "issue-opened")!.job } as Extract<MailJob, { kind: "thread" }>;
5959 job.data = { ...job.data, title: `<img src=x onerror=alert(1)>`, body: `<script>alert(1)</script> **bold**` };
60- const e = compose(job, PUB, "octocat");
60+ const e = compose(job, PUB, "diffy");
6161 const html = toHtml(e, { publicUrl: PUB, reason: job.reason, unsubscribe: [] });
6262 expect(html).not.toContain("<img src=x");
6363 expect(html).not.toContain("<script>alert(1)");
@@ -76,7 +76,7 @@
7676
7777 describe("mentions", () => {
7878 it("finds @logins outside code", () => {
79- expect(mentions("Hey @Octocat and @rivera-2, see `@notme` and\n```\n@alsonot\n```\nmail me@example.com")).toEqual(["octocat", "rivera-2"]);
79+ expect(mentions("Hey @Diffy and @rivera-2, see `@notme` and\n```\n@alsonot\n```\nmail me@example.com")).toEqual(["diffy", "rivera-2"]);
8080 expect(mentions(null)).toEqual([]);
8181 });
8282 });