Skip to content
This repository was archived by the owner on Oct 23, 2026. It is now read-only.

feat: list open roles from Gem's job board API - #423

Merged
AbhishekDoshi26 merged 2 commits into
mainfrom
jobs-link-to-gem
Oct 14, 2026
Merged

AbhishekDoshi26 merged 2 commits into
mainfrom
jobs-link-to-gem

Conversation

@eseidel

@eseidel eseidel commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Replaces the embedded Gem job board iframe on /jobs with our own list, fetched in the browser from Gem's public job board API (api.gem.com/job_board/v0/shorebird-dev/job_posts/).

  • Each role shows title and location, and links to its Gem page to apply.
  • A "See all open positions" link to the Gem board stays as the fallback.
  • New roles appear without a redeploy.

npm run build passes. Checked locally in a browser: the list renders on desktop and mobile.

Replaces the embedded Gem job board on /jobs with a list fetched from Gem's public job board API. Each role links to its Gem page to apply.
@eseidel
eseidel enabled auto-merge (squash) October 13, 2026 22:57
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

🐦 Preview of 13a2e25: https://shorebird-website--pr-423-katso9gk.web.app (expires in 7 days)

@AbhishekDoshi26 AbhishekDoshi26 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reviewed the diff and checked the live API.

Verified OK:

  • GET https://api.gem.com/job_board/v0/shorebird-dev/job_posts/ returns a bare array whose items have title, absolute_url and location.name, so JobPost matches. CORS reflects the request origin (shorebird.dev, www, *.web.app previews, localhost all allowed), so previews and local dev work too.
  • Using DOM APIs and textContent (not innerHTML) keeps Gem data from injecting markup.
  • All the custom utilities (page-container, pb-section-l, pb-text-*, title-l/s, body-s/m, border-border, hover:bg-surface-2) exist in global.css.
  • If the response isn't an array, for…of throws and the .catch handles it.

One thing to fix:

  1. Blank gap when there are no roles or the fetch fails. #job-list has min-h-24 pb-text-xl, so it always reserves ~96px plus spacing. That's good for avoiding layout shift while loading. But when Gem returns [], responds non-OK, or the request fails, the list stays an empty box between the intro and the "See all open positions" button. I'll push a fix that hides the list when nothing renders, so the page collapses to the intro and the fallback button.

@AbhishekDoshi26 AbhishekDoshi26 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Re-reviewed at 13a2e25 with a fresh pass. The API shape matches JobPost; non-OK, network/CORS and non-array responses all end with the list hidden and the fallback link visible; Tailwind's [hidden] preflight (display:none !important) beats flex; there's no innerHTML; and all utilities exist. CI is green. LGTM.

Non-blocking follow-ups if wanted: role titles inherit the base a color (--text-2) rather than --text-1, and the list could use aria-live="polite" since roles arrive after load.

@AbhishekDoshi26
AbhishekDoshi26 merged commit fb5c95f into main Oct 14, 2026
3 checks passed
@AbhishekDoshi26
AbhishekDoshi26 deleted the jobs-link-to-gem branch October 14, 2026 12:34
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants