ship-pr
Skill5.1k starsChanged 4 days agoMITView on GitHub
Take finished work in Expensify/App to a PR a human can review without fighting CI or bots. Runs the checks, verifies the change in the running app, gets a fresh-context self-review for the human to triage, opens a PR from your fork (draft by default) with the App template, then babysits it. Use whenever you are asked to open, create, ship, or submit a PR, or when implementation is done and the next step is review.
- Commits and pushes
30 other projects use a version of this.
Trending
More talk lately.about the whole repository
Most recently taken up by
- connext-solutions/flowctltheir own version, first seen Nov 15, 2026
- nicholasjconn/skillstheir own version, first seen Nov 15, 2026
- NomadicDaddy/aiddtheir own version, first seen Nov 15, 2026
- labsai/EDDItheir own version, first seen Nov 15, 2026
- devcules/devculestheir own version, first seen Nov 8, 2026
- simonwong/skillstheir own version, first seen Nov 6, 2026
Who's talking about Expensify/App
- react/react-native“RNGP - Add option to disable bundle compression (was: Make all React Native apps start 12% faster)”GitHub · Feb 15, 2025 · 255 reactions
- A Hacker News story“Offline UX Patterns”Hacker News · Sep 28, 2024 · 124 points
- kirillzyusko/react-native-keyboard-controller“feat: introduce `KeyboardChatScrollView`”GitHub · Feb 18, 2026 · 34 reactions
- actions/runner“Debug logs for the if condition of skipped jobs”GitHub · Jul 13, 2022 · 16 reactions
- @webpro.nl“✂️ knip's about to support react native + metro 🙏 do you know of public react native + metro repo(s) for …”Bluesky · Jan 6, 2025 · 11 likes
The biggest 5 of 56 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 56
Talked about on GitHub, Bluesky, Stack Overflow and Hacker News (56 times).
On GitHub · 50
- Feb 15, 2025RNGP - Add option to disable bundle compression (was: Make all React Native apps start 12% faster) — react/react-nativesays it tested it255 reactions · 34 comments
- Feb 18, 2026feat: introduce `KeyboardChatScrollView` — kirillzyusko/react-native-keyboard-controller34 reactions · 4 comments
- Jul 13, 2022Debug logs for the if condition of skipped jobs — actions/runner16 reactions · 5 comments
- Sep 11, 2023[IOS] Text replacement by dot after 2 spaces — react/react-native6 reactions · 33 comments
- Nov 30, 2021Scroll back Mobile Safari when overscrolled — necolas/react-native-web3 reactions
45 more on GitHub
- Jun 18, 2026chore: upgrade codecov/codecov-action from v5 to v7.0.0 [backport release/1.4.0] — Doezer/Questarr2 reactions · 3 comments
- Jun 18, 2026chore: upgrade codecov/codecov-action from v5 to v7.0.0 — Doezer/Questarr2 reactions · 3 comments
- May 4, 2026Remove initWithStoredValues from Onyx — Expensify/react-native-onyx2 reactions · 14 comments
- Feb 16, 2026[Onyx Audit] Remove try/catch block from getCollectionKey — Expensify/react-native-onyx2 reactions · 8 comments
- Dec 12, 2024Expo modules on web don't work when classes are changed to be anonymous — expo/expo2 reactions · 12 comments
- Feb 15, 2024fix(new arch): change how screen size is calculated — software-mansion/react-native-screens2 reactions · 2 comments
- Sep 22, 2023feat: add web support — lottie-react-native/lottie-react-native2 reactions · 5 comments
- Aug 29, 2023feat: bump node version to 18.17.1 — Expensify/react-native-onyx2 reactions · 15 comments
- Jul 26, 2023Remove string selector — Expensify/react-native-onyx2 reactions · 3 comments
- Jul 15, 2023Fix TextInput vertical alignment issue when using lineHeight prop on iOS without changing Text baseline (Paper - old arch) — react/react-native2 reactions · 9 comments
- Mar 16, 2023feat: Extend Disable Transformation property for Android — DylanVann/react-native-fast-image2 reactions · 1 comment
- Jan 27, 2023Update repo with upstream changes — Expensify/react-native-web2 reactions · 6 comments
- Nov 10, 2026[No QA] Order CODEOWNERS so the workflows rule takes precedence — Expensify/react-native-onyx1 reaction · 4 comments
- Nov 9, 2026Oxlint support with buildOxlintConfig — Expensify/eslint-config-expensify1 reaction · 16 comments
- Nov 6, 2026Allowlist the blacksmith-12vcpu-macos-27 runner label in actionlint — Expensify/GitHub-Actions1 reaction · 4 comments
- Nov 2, 2026Update node-forge to 1.4.2 — Expensify/react-native-onyx1 reaction · 5 comments
- Oct 26, 2026Bump form-data to 4.0.6 to address Dependabot alerts — Expensify/react-native-onyx1 reaction · 3 comments
- Oct 26, 2026Upgrade reassure to 1.6.0 to fix mathjs vulnerabilities — Expensify/react-native-onyx1 reaction · 7 comments
- Oct 26, 2026Bump minimatch to 3.1.5 and 9.0.9 — Expensify/react-native-onyx1 reaction · 5 comments
- Oct 26, 2026Bump flatted to 3.4.4 (GHSA-rf6f-7fwh-wjgh) — Expensify/react-native-onyx1 reaction · 10 comments
- Oct 26, 2026Bump linkify-it from 5.0.0 to 5.0.2 — Expensify/react-native-onyx1 reaction · 6 comments
- Oct 26, 2026Bump brace-expansion to 1.1.21 and 2.1.7 — Expensify/react-native-onyx1 reaction · 6 comments
- Oct 26, 2026Bump shell-quote from 1.8.3 to 1.12.0 — Expensify/react-native-onyx1 reaction · 5 comments
- Oct 23, 2026Fix cache-miss diagnostic for undefined keys — Expensify/react-native-onyx1 reaction · 13 comments
- Oct 22, 2026Add opt-in Gradle restrictions to Java remediation — Expensify/GitHub-Actions1 reaction · 1 comment
- Oct 21, 2026Bump Node to 24.22.1 to block the compromised eMudhra intermediates — Expensify/react-native-onyx1 reaction · 4 comments
- Oct 21, 2026Deep compare arrays on merge and return old array if unchanged — Expensify/react-native-onyx1 reaction · 9 comments
- Oct 7, 2026Remove Onyx.disconnect() — Expensify/react-native-onyx1 reaction · 4 comments
- Oct 6, 2026Skip unchanged cached subtrees when removing nested nulls — Expensify/react-native-onyx1 reaction · 14 comments
- Oct 5, 2026Remove unused lodash.pick dependency — Expensify/react-native-onyx1 reaction · 10 comments
- Oct 2, 2026Revert "Remove the .repository-content fallback from the K2 dashboard" — Expensify/k2-extension1 reaction · 6 comments
- Sep 22, 2026Switch actionlint to the kjanat fork, v1.17.0 — Expensify/GitHub-Actions1 reaction
- Sep 22, 2026Set cache-mode: read on reusable workflow calls from low-trust triggers — Expensify/react-native-onyx1 reaction · 2 comments
- Sep 14, 2026[No QA][CLA] Allowlist Copilot so its commits stop failing the CLA check — Expensify/GitHub-Actions1 reaction · 2 comments
- Sep 7, 2026Fix no-unsafe-type-assertion in Str.result — Expensify/react-native-onyx1 reaction · 5 comments
- Jul 21, 2026iOS: Content in `KeyboardStickyView` is stuck while keyboard is dismissed interactively — kirillzyusko/react-native-keyboard-controller1 reaction
- Jun 19, 2026Upgrade eslint-config-expensify to 4.0.8 — Expensify/react-native-onyx1 reaction · 11 comments
- Feb 20, 2026Support @prettier/plugin-oxc — trivago/prettier-plugin-sort-imports1 reaction
- Dec 10, 2025iOS 16+: Extra bottom padding in multiline MarkdownTextInput (TextKit 2) — Expensify/react-native-live-markdown1 reaction · 1 comment
- Jun 18, 2025Guideline tip on paths-ignore for the GH Actions integration — callstackincubator/rock1 reaction
- Jul 29, 2024Enforce | before multiline run statement — rhysd/actionlint1 reaction · 1 comment
- Mar 13, 2024Enable custom parseRunOptions — kiegroup/act-js1 reaction · 1 comment
- May 15, 2023 Pressing space 2 times "." appears in the Input (double-tapping Double-space feature) — react/react-native1 reaction · 13 comments
- Nov 23, 2022Plugin not working with webpack-dev-server — icelam/html-inline-script-webpack-plugin1 reaction · 6 comments
- Nov 8, 20261 — ehsansuccessbyte/App0 reactions
On Bluesky · 3
- Jan 6, 2025✂️ knip's about to support react native + metro 🙏 do you know of public react native + metro repo(s) for some further experiments and test… — @webpro.nl11 likes and reposts · 1 reply
- Dec 4, 2024📦 Expensify / App ⭐ 3,607 (+6) 🗒 TypeScript Welcome to New Expensify: a complete re-imagination of financial collaboration, centered… — @github-trending.bsky.social1 likes and repost
- Dec 5, 2024🔥 Hot Repo! 🔥 (100+ new stars) 📦 Expensify / App ⭐ 3,720 (+120) 🗒 TypeScript Welcome to New Expensify: a complete re-imagination of… — @github-trending-js.bsky.social0 likes and reposts · 1 reply
On Stack Overflow · 2
- Aug 27, 2024React Native: debugging in chrome, no original source files available0 votes
- Dec 29, 2023I encountered error trying to run a Android Build using React-native (error Failed to build the app: No package name found)0 votes · 1 answer
On Hacker News · 1
- Sep 28, 2024Offline UX Patterns124 points · 24 comments
Used with
Projects with it also use ideate, review-pr and 8 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
OpenAISkillideate
Generate image-based alternatives, remixes, or new design directions from a Product Design brief. Use when the user asks for design variants, visual exploration, remixes, or image-generated approaches from provided context.
Also in 4 projects that use this
DockerSkillreview-pr
Review one or more incoming Docker documentation pull requests as a maintainer. Independently validate technical claims, assess editorial fit and information architecture, choose a verdict, and draft exact inline or PR-wide feedback behind a confirmation gate. Use for requests such as "review PR 123", "is this PR correct?", "does this information belong here?", "validate this PR", or "help review backlog PRs". Do not use to maintain or fix a PR you own; use maintain-pr for that.
Also in 4 projects that use this
Google CloudSkilltriage
Gather context on a change or bug and plan the implementation.
Also in 4 projects that use this
GoogleSkilldiagnosing-bugs
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.
Also in 3 projects that use this
GoogleSkilldomain-modeling
Build and sharpen a project's domain model. Use when the user wants to pin down domain terminology or a ubiquitous language, record an architectural decision, or when another skill needs to maintain the domain model.
Also in 3 projects that use this
Hugging FaceSkillimplement
Make tests pass. Invoke after /write-tests produces failing tests.
Also in 3 projects that use this
- +3 more from google
Other versions30 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 30
- kentcdodds/kentcdodds.com★ 2.5ksame name
- kentcdodds/kody★ 926same name
- pedronauck/skills★ 655same name
- labsai/EDDI★ 394same name
- openbootdotdev/openboot★ 277same name
- gymcoach-app/gymcoach★ 187same name
- Julien-Au/gymcoach★ 187same name
- kentcdodds/kcd-skills★ 64same name
- svyatov/supermatt★ 20same name
- devcules/devcules★ 17same name
20 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository10 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- agent-device-evidenceSkill
- agent-deviceSkill
- app-coding-standardsSkill
- babysitSkill
- measure-telemetry-spanSkill
- onyxSkill
- playwright-app-testingSkill
- sentrySkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 3 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 30 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
Run every step. If one can't run, say which one and why in the handoff.
- Distinctive: line 16
Run what CI runs for what you touched, and fix everything:
- Very specific: line 32
Every test has // Given, // When, // Then comments explaining why.
- Very specific: line 36
No new useMemo, useCallback or React.memo in a file the React Compiler handles.
- Distinctive: line 54
If you couldn't verify something, say so and name what stopped you.
- Very specific: line 63
Don't fix anything yet. Show the human every critical and important finding with:
- Distinctive: line 71
If you can't spawn a reviewer, re-read the whole diff cold against the same prompt yourself and say so in the handoff.
- Very specific: line 85
After approval, push to your fork (origin below) and open it.
“Common” is measured: kept by at least 6 in 10 of the 30 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Ship a PR
You're done when the human only has judgment calls left on the PR: the checks are green, the change is shown working in the app, a fresh reviewer has read the diff, and every bot comment is handled.
Run every step. If one can't run, say which one and why in the handoff. Nothing gets committed, pushed or posted without the human's approval: they own what goes on the PR (contributingGuides/AI_ETIQUETTE.md).
Commands below use upstream for the Expensify/App remote, which is the usual setup when you work from a fork. If you cloned Expensify/App directly, use origin instead.
1. Checks
Run what CI runs for what you touched, and fix everything:
npm run fmt # oxfmt, a CI gate the CLAUDE.md post-edit checklist doesn't list
npm run lint-changed
npm run typecheck
npm run react-compiler-compliance-check check-changed
npm run spell-changed
npm test -- <test files for the code you changed> # direct test files; CI runs the full suitelint-changedandspell-changeddiff againstorigin/main. Iforiginis your fork, sync itsmainwith Expensify/App first (git fetch upstream && git push origin upstream/main:main), so they only see your changes.- Skip
--findRelatedTests. Core libs are imported almost everywhere, so it pulls in most of the suite (over 10 minutes forMoneyRequestReportUtils). CI runs everything in about 2.5 minutes.
Then the repo rules the tooling cannot see (CLAUDE.md, tests/README.md):
- Every test has
// Given,// When,// Thencomments explaining why. - A bug fix comes with a test that fails without the fix, or the handoff says why it can't.
- A new
Onyx.connectWithoutViewhas a comment justifying it. In a component it also needs@frontend-performanceapproval linked in the PR body. - New strings go in
src/languages/en.tsonly. The other locales are generated from it byscripts/generateTranslations.ts. On a PR from a fork that doesn't run automatically, so say in the handoff that someone from Expensify has to run it. - No new
useMemo,useCallbackorReact.memoin a file the React Compiler handles. - The
Mobile-Expensifysubmodule pointer didn't move by accident:git diff --ignore-submodules=none upstream/main...HEAD -- Mobile-Expensify. Stage by path, nevergit add -A,git add .orgit commit -a.
2. Verify
Prove the change on the surface it touches. CI can't see this part, so it's the evidence the reviewer needs.
| Change | Run | Evidence |
| Web UI | /playwright-app-testing against the local dev server (:8082), never production | Screenshots or a recording for MacOS: Chrome / Safari |
| Native UI or platform code | /agent-device on the iOS simulator or Android emulator | /agent-device-evidence MP4s for the native sections |
| Logic with no UI | Jest | The test names, in ### Tests |
| Performance | /measure-telemetry-span, before and after, on realistic data | A before/after table |
- For a bug fix, capture the bug before fixing it, with the failing test first or a recording of the broken behavior. Checking out
mainlater costs a freshnpm installin another worktree. - The template asks for five platforms. Cover what you can and name the rest in the handoff. Never tick a box for a platform you didn't test.
- Ad hoc builds (the test builds an Expensify employee triggers on a PR) are out of scope. If a change needs one, say so in the handoff.
If you couldn't verify something, say so and name what stopped you. "Inconclusive" is more useful to the reviewer than a confident claim with no evidence.
3. Self-review in a fresh context
The agent that wrote the change doesn't get to judge it. Spawn two reviewers with no memory of this conversation, in parallel:
- Bug hunt: give it references/review-prompt.md with
<base>and<triage-file>filled in. - Rules: have it check the local diff (
git diff $(git merge-base upstream/main HEAD), since there is no PR forgh pr diffyet) against every rule in.claude/skills/app-coding-standards/rules/. claude-review applies the same rules once the PR is out of draft, so fixing them now saves a review round.
Don't fix anything yet. Show the human every critical and important finding with:
- the finding as
file:line, severity, and what breaks - your verdict: agree or disagree, with one line why (check the claim against the code first)
- the fix you'd make, for the ones you agree with
The human decides which to fix. Fix only those, then rerun steps 1 and 2 for what the fixes touched. Keep a one-line reason for every finding left unfixed, for the handoff.
If you can't spawn a reviewer, re-read the whole diff cold against the same prompt yourself and say so in the handoff.
4. Commit and open
- Branch off an up-to-date
upstream/main. Titles and commits use<type>: <description>(fix, feat, refactor, upgrade, chore, docs, test, perf, ci), the branch name starts with the same type (fix/...), and commit messages stay on one line. - The body is
.github/PULL_REQUEST_TEMPLATE.mdas it is:### Explanation of Change: a few plain sentences on what changed and why.### Fixed Issues: the full$ https://github.com/Expensify/App/issues/<id>link and thePROPOSAL:link.### Tests,### Offline tests,### QA Steps: numbered steps a reviewer can repeat, built from step 2.[No QA]goes in the title when QA has nothing to test.### Screenshots/Videos: the step 2 evidence under each platform.- The author checklist: never change its text, and leave the boxes to the human. The human ticks them to vouch for the PR.
- Show the human the title, body, media list and commits, and ask whether to open it as a draft or ready for review. Default to draft:
- Draft: claude-review and Codex skip drafts, so babysit clears CI first and the bot round starts when the human marks it ready.
- Ready for review: the bots and reviewers start right away.
- After approval, push to your fork (
originbelow) and open it. Drop--draftwhen the human picked ready for review:
git push origin HEAD
gh pr create --repo Expensify/App --base main --head <fork-owner>:<branch> --draft --title "<type>: <description>" --body-file <file>Media upload with gh pr create --attach needs gh 2.99+. With an older gh, the human drags the step 2 files into the PR in the browser: list their paths in the handoff.
5. Babysit
Hand the PR to the babysit skill and run it to READY. If you opened a draft, babysit again once the human marks it ready, for the claude-review and Codex round that follows.
Handoff
Reply to the human with:
- the PR URL and the babysit verdict
- how it was verified (surface, what you ran, what you saw, where the media is, platforms not covered)
- which review findings the human chose to fix, and the one-line reason for each one left unfixed
- anything left for them: checklist boxes, media upload, marking it ready, escalated threads, parts you could not verify
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

