Skip to content

feat: add ci/cd for builds#89

Merged
evan-taylor merged 2 commits intodevfrom
evan/ci-cd
Apr 16, 2026
Merged

feat: add ci/cd for builds#89
evan-taylor merged 2 commits intodevfrom
evan/ci-cd

Conversation

@evan-taylor
Copy link
Copy Markdown
Collaborator

@evan-taylor evan-taylor commented Apr 16, 2026

Linked Issues

Closes #
Linear: (e.g., POLY-123)

Summary

Briefly explain the change and why.

How to Test

Steps to verify locally:

  • npm run lint
  • npm run typecheck
  • npm test
  • Manual flow:
    1. npm run dev:backend (in terminal A)
    2. npm run dev (in terminal B)
    3. Verify the change: <describe expected behavior/screens>

Checklist

  • Tests added/updated (if applicable)
  • Lint/tests pass locally (npm run lint)
  • Docs updated (README/ADR/changelog if needed)
  • Follows conventional commit format
  • No merge conflicts with dev

Screenshots / Demos

(if UI or visible behavior - attach images, videos, or GIFs)

Summary by CodeRabbit

  • Chores
    • Added automated iOS TestFlight build workflow that triggers on updates to the main branch
    • Added manual iOS TestFlight build workflow for on-demand development testing

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 16, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
poly-buys Ready Ready Preview, Comment Apr 16, 2026 10:56pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 2026

Warning

Rate limit exceeded

@evan-taylor has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 54 minutes and 11 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 54 minutes and 11 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: dcfdc499-5993-4bc6-be34-93d1e9bc6445

📥 Commits

Reviewing files that changed from the base of the PR and between d5a7d80 and cec911c.

📒 Files selected for processing (1)
  • .github/workflows/ios-release-main.yml
📝 Walkthrough

Walkthrough

Two new GitHub Actions workflows are introduced for iOS builds and TestFlight submissions. The development workflow (ios-release-dev.yml) is manually triggered via workflow_dispatch, while the main workflow (ios-release-main.yml) automatically triggers on pushes to the main branch. Both workflows check out the repository, set up Node.js 20.19.4, configure Expo/EAS, install dependencies, build iOS IPAs using EAS with the production profile, submit to TestFlight, and upload artifacts.

Changes

Cohort / File(s) Summary
iOS TestFlight Workflows
.github/workflows/ios-release-dev.yml, .github/workflows/ios-release-main.yml
Two new GitHub Actions workflows for building and submitting iOS apps to TestFlight. Dev workflow is manually triggered; main workflow auto-triggers on pushes to main. Both use Node.js 20.19.4, Expo/EAS setup, build iOS IPAs with production profile, submit to TestFlight, and upload build artifacts with configurable retention policies.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 Hop, build, and fly so high,
Two workflows reach the TestFlight sky,
Dev and main, both set to go,
iOS apps put on a show! ✨📱

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description consists entirely of unused template placeholders with no actual content filled in—missing linked issues, summary explanation, how to test instructions, and test verification. Fill in the description with actual content: specify linked issues, explain why CI/CD workflows were added, describe testing procedures, and detail what was implemented in the iOS release workflows.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: add ci/cd for builds' clearly and concisely describes the main change—adding GitHub Actions workflows for iOS TestFlight builds and submission.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch evan/ci-cd

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
.github/workflows/ios-release-main.yml (2)

27-31: Pin eas-version instead of tracking latest.

eas-version: latest means a new EAS CLI release can silently change build/submit behavior (breaking flags, schema changes, etc.) on your next push to main. Pin to a known-good version (e.g. eas-version: 16.x.x) and bump intentionally. Same comment applies to ios-release-dev.yml line 29.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ios-release-main.yml around lines 27 - 31, Replace the
eas-version: latest setting in the step that uses expo/expo-github-action@v8
with a pinned, known-good EAS CLI version (for example eas-version: 16.x.x) so
builds don't silently change; update the same eas-version pin in the
corresponding dev workflow's expo/expo-github-action@v8 step as well and commit
the changed version string rather than leaving it as "latest".

11-15: Add a least-privilege permissions: block.

Neither workflow declares permissions:, so the GITHUB_TOKEN inherits the repo/org default (often read/write). For a build+submit workflow that only needs to read the repo and upload artifacts, scope it explicitly.

🛡️ Suggested diff
 jobs:
   build-and-submit:
     name: Build and submit iOS
     runs-on: macos-latest
     timeout-minutes: 90
+    permissions:
+      contents: read
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ios-release-main.yml around lines 11 - 15, The workflow
lacks an explicit least-privilege permissions block; add a top-level
permissions: entry for this workflow that scopes GITHUB_TOKEN to only what the
build-and-submit job needs (e.g. set contents: read and artifacts: write and
packages: write), and if your submission step uses OIDC include id-token: write;
add this permissions block at the top of the workflow YAML so the
build-and-submit job (name "Build and submit iOS") uses the restricted token and
adjust scopes if any steps require id-token or additional access.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ios-release-main.yml:
- Around line 3-5: The workflow currently triggers on "on: push" with "branches:
[main]" which runs TestFlight builds for every commit; change the trigger
configuration for the ios-release-main.yml workflow by replacing or augmenting
the "on: push/branches: [main]" trigger with a more selective trigger such as
"push: tags: ['v*']" or "release" or "workflow_dispatch", and optionally add
"paths:" filters to exclude doc/backend-only changes — update the top-level on:
block to use the chosen trigger(s) so macOS runners and TestFlight submissions
only run for intentional releases or tags.

---

Nitpick comments:
In @.github/workflows/ios-release-main.yml:
- Around line 27-31: Replace the eas-version: latest setting in the step that
uses expo/expo-github-action@v8 with a pinned, known-good EAS CLI version (for
example eas-version: 16.x.x) so builds don't silently change; update the same
eas-version pin in the corresponding dev workflow's expo/expo-github-action@v8
step as well and commit the changed version string rather than leaving it as
"latest".
- Around line 11-15: The workflow lacks an explicit least-privilege permissions
block; add a top-level permissions: entry for this workflow that scopes
GITHUB_TOKEN to only what the build-and-submit job needs (e.g. set contents:
read and artifacts: write and packages: write), and if your submission step uses
OIDC include id-token: write; add this permissions block at the top of the
workflow YAML so the build-and-submit job (name "Build and submit iOS") uses the
restricted token and adjust scopes if any steps require id-token or additional
access.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 038fb370-cc04-4f3e-923c-c31301673193

📥 Commits

Reviewing files that changed from the base of the PR and between 23fdc62 and d5a7d80.

📒 Files selected for processing (2)
  • .github/workflows/ios-release-dev.yml
  • .github/workflows/ios-release-main.yml

Comment thread .github/workflows/ios-release-main.yml
@evan-taylor evan-taylor merged commit 7ce0212 into dev Apr 16, 2026
2 of 4 checks passed
@evan-taylor evan-taylor deleted the evan/ci-cd branch April 16, 2026 22:55
evan-taylor added a commit that referenced this pull request Apr 21, 2026
* feat: misc frontend UI fixes and improvements

- Fix duplicate sign-in messages on profile tab
- Redirect unauthenticated users to profile on Create Listing (web)
- Fix browser tab title persisting after leaving a listing
- Style placeholder text with lighter grey across profile and create listing forms
- Standardize Create Listing button to brand green (#154734)
- Capitalize category and condition values on listing detail page
- Add profile setup check before creating listings with visible warning banner
- Replace Alert.alert with cross-platform showAlert for web compatibility
- Add Delete button to My Listings with confirmation dialog

* fix: address PR review feedback

- Extract showAlert into shared utils/showAlert.ts module
- Prevent concurrent deletes in my-listings (guard + disable all buttons)
- Fix year reset to empty string in settings signed-out useEffect
- Remove unused Alert/Platform imports from new.tsx

* fix(vercel): declare @sentry/react-native in frontend workspace

Expo resolves @sentry/react-native/expo relative to the frontend package; it was only on the root workspace so Vercel installs did not expose the plugin and expo export failed.

Made-with: Cursor

* fix: address team feedback — auth timeout, seller avatar, download link, image lightbox

- Add 8s timeout + retry button to auth 'checking' step to prevent infinite spinner
- Replace empty grey seller avatar with initials (first letter of name) on listing detail
- Make seller block tappable, navigates to public profile
- Change 'Open in App' to 'Download App' with placeholder App Store URL
- Add download hint link to OpenInAppPrompt component
- Create ImageLightbox component for full-screen uncropped image viewing
- Wrap all listing hero images in Pressable to open lightbox on click
- Support keyboard navigation (Escape, ←, →) in lightbox on web

* fix: address PR feedback for UI components and auth flow

- Fix login retry timer leak

- Fix ImageLightbox filtered array index mismatch and add auto-focus on web

- Improve OpenInAppPrompt link error handling and accessibility labels

- Move APP_STORE_URL and APP_SCHEME to shared constants

* chore: satisfy eslint any warning for lightbox web props

* fixed search

* feat(frontend): dedicated account settings from profile tab

- Add /account-settings stack screen with message notifications, sign out, and delete account
- Profile tab shows a Settings row (and account settings on incomplete profile) linking there
- Web: OpenInAppPrompt for account settings deep link, consistent with profile tab
- Fix typed-route pushes with as never where the generated routes lag

Made-with: Cursor

* red box

* red box

* blocked users

* code rabbit fix

* more fixes

* feat: add Other as a report reason for listing moderation (POLY-70)

* fix: keyboard overlaps input on Create/Edit Listing screens (POLY-75)

* feat: ui changes to save/share buttons

* fix: login redirect bug

* fix: route profileless users to onboarding

Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com>

* test: cover login onboarding redirect

* Match UI of MyListing and Home

* chore: remove ios build files from PR

* feat(frontend): dismissible flash banner and safe placement

- Add FlashProvider with bottom-inset positioning above tab/home area
- pointerEvents box-none/auto so banner receives taps; tap or Dismiss clears
- Shorter auto-dismiss when reduce motion is enabled
- Wire create/edit listing, mark sold, and report success to setFlash
- ReportModal optional onReportSuccess for non-blocking confirmation

Made-with: Cursor

* transparent

* more transparent

* chore(frontend): shared report copy; longer flash for reduce motion

- Add feedbackMessages constants for report success (flash + Alert)
- Use REPORT_SUBMITTED_MESSAGE in listing and profile screens
- Increase FLASH_DURATION_REDUCED_MS to 4000 for readability

Made-with: Cursor

* feat: remove tags from UI and backend (POLY-77)

* Remove unrelated changes from PR

* fix: coderabbit errors

* fix(vercel): declare @sentry/react-native in frontend workspace

Expo resolves @sentry/react-native/expo relative to the frontend package; it was only on the root workspace so Vercel installs did not expose the plugin and expo export failed.

Made-with: Cursor

* feat(frontend): polish listing cards (POLY-76)

- Vertical stack: multi-line title (2 lines home, 3 default), condition caption, price
- Clearer hierarchy: dark title, muted condition, bold accent price
- More padding and md card radius; softer shadow; slightly looser grid spacing on home

Made-with: Cursor

* feat(frontend): short description preview on listing cards

- Plain descriptions: up to 2 lines, footnote style, ellipsized
- Multi-line or -/• lists: up to 2 bullet rows with trimmed markers
- Include snippet in accessibility label (capped length)

Made-with: Cursor

* feat(frontend): smarter listing description bullets (heuristics)

- Extract buildDescriptionPreview: newlines/markers, semicolons, then sentences
- Use Intl.Segmenter when available with regex fallback for sentences
- Up to 3 bullets; support numbered line prefixes
- Tests for preview helper; exclude frontend __tests__ from tsc

Made-with: Cursor

* fix(frontend): omit prose after last bulleted line in card preview

- When 2+ lines start with list markers, only those lines become bullets
- descBlock uses overflow hidden as a layout safeguard

Made-with: Cursor

* fix(frontend): numbered lists without space after dot and inline 1. 2.

- Scan for digit+dot boundaries (not decimals like 2.0) across lines and spaces
- Relax line markers so 1.Item matches; run span scan before line-based bullets
- Tests for tight 1.x/2.x lines and single-line numbered lists

Made-with: Cursor

* feat(frontend): one bullet per description line when user uses Enter

- Drop short-line / looksLikeList gate: any 2+ non-empty lines become bullets
- Keep marked-only slice when 2+ lines start with list markers (trailing prose omitted)
- Cap 12 lines, 300 chars per line; strip optional -/1. prefixes per row

Made-with: Cursor

* fix(frontend): trim prose after last bullet (numbered + single dash)

- Numbered items: drop flush lines after first line in each span; keep indented wraps
- One dash bullet + following unmarked lines: show only the marked line
- Tests for numbered tail and single-dash + prose

Made-with: Cursor

* chore(frontend): address CodeRabbit ListingCard + preview tests

- Require listing.condition on ListingCard; exhaustive formatConditionLabel
- Memoize accessibilityLabel from parts; spacing.smPlus for cardDetailsHome
- Tests: 78-char cap and DESC_PREVIEW_BULLET_MAX

Made-with: Cursor

* feat: fixed a ton of stuff, standardize UI (#86)

* feat: fixed a ton of stuff, standardize UI

* fix block user success feedback

Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com>

* style format conversation block flow

Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com>

* fix listing sold state race checks

Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com>

* feat: update UI themes and improve tab navigation (#87)

- Changed userInterfaceStyle to 'light' in app.json for consistent appearance.
- Refactored theme handling in _layout.tsx to use a custom navigation theme.
- Updated tab navigation styles in (tabs)/_layout.tsx to utilize nativeChrome for better visual consistency.
- Enhanced search and inbox screens to align with new theme settings.
- Added nativeChrome configuration for improved UI elements across the app.

This commit aims to standardize the UI and enhance user experience across different screens.

* feat: implement profile pictures

* fix: coderabbit changes, fix top border on profile page

* feat: add ci/cd for builds (#89)

* feat: add ci/cd for builds

* fix: don't build on backend or docs changes

* fix: inbox search keyboard close (#90)

* feat: fix xcode provisioning on ci/cd (#91)

* fix: add app id to expo (#92)

* feat: run convex deploy and add agent skill (#93)

* feat: run convex deploy and add agent skill

* fix: run convex deploy on manual ci too

* feat: add report and delete for entire conversations

* feat: fix prevent swipe actions from showing through on row press

* feat: add tooltip and add tap to close swipe

* feat: add report and delete for individual messaging

* fix(frontend): keyboard avoidance for price range picker modal

- KeyboardAvoidingView (iOS padding, Android height) above bottom sheet
- ScrollView so presets, inputs, and Apply stay reachable when keyboard is open
- Backdrop as sibling Pressable so sheet scrolling is not blocked
- Safe-area padding on scroll content; cap sheet height for smaller screens

Made-with: Cursor

* chore(frontend): dedupe Sentry dep; dim price picker backdrop

- Remove duplicate @sentry/react-native from package.json
- Restore modal scrim on PriceRangePicker backdrop (rgba 0.35)

Made-with: Cursor

* fix: remove listings when conversation reported, clean up functionality

* fix: no deleting individual messages

* fix: remove tooltip

* feat: redirect new users to home

* feat: redirect to home after logging in

* fix: add code rabbit changes

* fix: onboarding copy so first-time users do not see Welcome back (POLY-86)

* feat: add required field indicators and inline validation to listing creation (POLY-91)

* feat: add date posted metadata to listing cards and detail page (POLY-92)

* fix choppyness (#101)

* feat: add zoom support to listing photos

* fix: address lightbox lint warnings

* chore: rerun ci for listing photo zoom

* fix: address lightbox review feedback

* feat: prevent functionality on web

* fix: ci config setup (#109)

* fix: match Dispatch<SetStateAction> signature for onImagesChange

* Feat/marketing landing (#95)

* fix(vercel): declare @sentry/react-native in frontend workspace

Expo resolves @sentry/react-native/expo relative to the frontend package; it was only on the root workspace so Vercel installs did not expose the plugin and expo export failed.

Made-with: Cursor

* feat(frontend): add marketing landing page and /home feed route

- Add web-only landing at / with value props, CTAs, and App Store compliance
- Desktop: QR code and mailto draft for the download link
- Narrow web: official App Store badge linking to APP_STORE_URL
- Rename (tabs)/index to home so / is the landing without route conflicts
- Point in-app "home" navigation and post-auth default to /home
- Register root index in the stack; dedupe @sentry/react-native in package.json
- Refresh lockfile so workspace resolves expo-blur for typecheck/bundling

Made-with: Cursor

* feat(web): block auth routes and remove login CTAs from landing

- Add auth/login.web.tsx so /auth/login always redirects to / on web
- Remove Sign in header link and Sign up button from LandingScreen
- Clarify copy: sign-in is app-only; web is browse-focused

Made-with: Cursor

* chore(frontend): address CodeRabbit marketing + web auth UX

- index: redirect authenticated web users to /home; show boot spinner while auth loads
- LandingScreen: brand Link to /home; static QR asset (no third-party API); App Store
  badge uses Link target=_blank on web
- types/assets.d.ts: declare *.png for Metro image imports
- constants: document APP_STORE_URL + QR regeneration
- home: web save/create no longer hits blocked /auth/login; use app-only alerts

Made-with: Cursor

* feat: revamp landing page, add legal docs

* fix: board and coderabbit feedback

* fix: feedback

---------

Co-authored-by: Evan Taylor <eltaylor1104@gmail.com>

* Feature/poly 90 button visibility (#108)

* feat: improve search tab and button visibility

* feat: polish search, buttons, and messaging flows

* fix: address ui review feedback

* fix: padding and styling changes

---------

Co-authored-by: Evan Taylor <eltaylor1104@gmail.com>

* fixes

* fix: address listing form validation review feedback

* fix: align home route references with expo router

* feat: add support page and links across the application (#111)

- Introduced a new support page for user assistance, accessible via /support.
- Updated LandingScreen to include a link to the support page and added legal links for Privacy and Terms.
- Enhanced the footer to include a link to the support page.
- Implemented support document retrieval with contact options for user inquiries.
- Adjusted styles for legal links and contact information display.

* fix: restore web browse route targets

* fix: improve keyboard avoidance in chat and price picker

* fix: address keyboard and safety banner review feedback

* featL liquid glass app icon (#112)

* feat: add support page and links across the application

- Introduced a new support page for user assistance, accessible via /support.
- Updated LandingScreen to include a link to the support page and added legal links for Privacy and Terms.
- Enhanced the footer to include a link to the support page.
- Implemented support document retrieval with contact options for user inquiries.
- Adjusted styles for legal links and contact information display.

* feat: add liquid glass app icon

* fix: revert message keyboard avoidance changes

* fix: avoid native driver conflict in price picker

* fix: make profile email read-only

* feat: polish login and profile flows

* fix: tighten profile tab and major selection

* fix: polish frontend login and profile flows

* fix: standardize keyboard chrome across frontend flows

* feat: polish frontend launch readiness

* chore: apply final review hardening updates

* chore: apply final review hardening updates

* fix: address accessibility and profile review comments

* fix: address frontend review findings

* fix: harden native image uploads and backend validation

---------

Co-authored-by: Cole <hackman@calpoly.edu>
Co-authored-by: dfed25 <domfederico21@gmail.com>
Co-authored-by: Jaydon Chen <79879038+jaydonkc@users.noreply.github.com>
Co-authored-by: MatthewPhan <Matthewminhphan@gmail.com>
Co-authored-by: SamanSP1386 <saman.sepehr86@gmail.com>
Co-authored-by: Haixin <haixinhuang502@gmail.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Evan Taylor <evan-taylor@users.noreply.github.com>
Co-authored-by: lheutchy <lheutchy@gmail.com>
Co-authored-by: Taye-Staats <tayestaats@outlook.com>
Co-authored-by: dfed25 <150391626+dfed25@users.noreply.github.com>
Co-authored-by: BoB121isawesome <79879038+BoB121isawesome@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant