Repository navigation
[docs-infra] Sync careers from the shared API - #49350
Conversation
Deploy previewBundle size
PerformanceNo regressions in 32 benchmarks · ran 4m 04s · details Check out the code infra dashboard for more information about this PR. |
b7eebf8 to
981ef59
Compare
981ef59 to
fb23b1b
Compare
| and tell us more about what you bring to the table. | ||
| </React.Fragment> | ||
| ) | ||
| <React.Fragment> |
There was a problem hiding this comment.
If we do want to have some next roles, how would the code look like?
There was a problem hiding this comment.
What do you mean ? Like when new roles are opened ?
In that case, we either trigger the sync workflow manually or let it run at its scheduled time which'll populate the new data into the json file, as long as they are open in Ashby.
There was a problem hiding this comment.
No, what I mean is that we have open and future roles. Future roles are typically roles we plan to open soon, but we are not actively hiring for right now - currently we don't have any, but we had them in the past, e.g. b00bdc7. Maybe we can have a manual list of roles that point to an ashby role. It's tricky tough as in that case we may actually want to have an opening. Maybe we will need some convention on how we flag future roles (like having future in the name or something).
There was a problem hiding this comment.
I don't see a reliable way to have a boolean custom field in the job posting.
So we might have to do something similar to what you are suggesting with title or some other field for such roles that we can normalize in our api side before consuming in our careers page.
There was a problem hiding this comment.
Alright, let's assume they contain the string "future role" in the title then, and I will send a message in the manager channel to let others know.
fb23b1b to
575b02b
Compare
212de09 to
2290e06
Compare
17b374e to
2514a61
Compare
There was a problem hiding this comment.
🟡 Changes recommended
API-supplied descriptions need sanitization before being published as executable HTML on mui.com.
2 open findings
What changed in this PR
Replaces manually maintained careers pages with a shared API snapshot and static role rendering.
Changes:
- Adds careers synchronization and combines it with weekly team updates.
- Renders listings and full role descriptions from one JSON snapshot.
- Removes legacy pages and adds redirects and a careers-specific 404.
| File | Description |
|---|---|
| package.json | Adds careers sync command. |
| docs/src/modules/components/TopLayoutCareers.js | Supports custom role content. |
| docs/src/components/careers/RoleEntry.tsx | Hides empty summaries. |
| docs/scripts/syncCareers.ts | Fetches and groups careers data. |
| docs/public/_redirects | Adds legacy redirects and 404 routing. |
| docs/pages/careers/technical-recruiter.md | Removes manual description. |
| docs/pages/careers/technical-recruiter.js | Removes legacy page wrapper. |
| docs/pages/careers/technical-product-manager.md | Removes manual description. |
| docs/pages/careers/support-agent.md | Removes manual description. |
| docs/pages/careers/staff-ui-engineer-base-ui.md | Removes manual description. |
| docs/pages/careers/staff-ui-engineer-base-ui.js | Removes legacy page wrapper. |
| docs/pages/careers/staff-engineer-pigment-css.md | Removes manual description. |
| docs/pages/careers/staff-engineer-pigment-css.js | Removes legacy page wrapper. |
| docs/pages/careers/senior-designer.md | Removes manual description. |
| docs/pages/careers/roles/[slug].tsx | Statically renders API-backed roles. |
| docs/pages/careers/ROLE_TEMPLATE.md | Removes manual authoring template. |
| docs/pages/careers/react-tech-lead-x-grid.md | Removes manual description. |
| docs/pages/careers/react-tech-lead-x-grid.js | Removes legacy page wrapper. |
| docs/pages/careers/react-tech-lead-core.md | Removes manual description. |
| docs/pages/careers/react-tech-lead-core.js | Removes legacy page wrapper. |
| docs/pages/careers/react-engineer-x.md | Removes manual description. |
| docs/pages/careers/react-engineer-x.js | Removes legacy page wrapper. |
| docs/pages/careers/react-engineer-x-grid.md | Removes manual description. |
| docs/pages/careers/react-engineer-x-charts.md | Removes manual description. |
| docs/pages/careers/react-engineer-x-charts.js | Removes legacy page wrapper. |
| docs/pages/careers/react-engineer-material-ui-maintainer.md | Removes manual description. |
| docs/pages/careers/react-engineer-material-ui-maintainer.js | Removes legacy page wrapper. |
| docs/pages/careers/react-engineer-explore.md | Removes manual description. |
| docs/pages/careers/react-engineer-explore.js | Removes legacy page wrapper. |
| docs/pages/careers/react-engineer-docs-infra.md | Removes manual description. |
| docs/pages/careers/react-engineer-docs-infra.js | Removes legacy page wrapper. |
| docs/pages/careers/react-engineer-core.md | Removes manual description. |
| docs/pages/careers/react-community-engineer.md | Removes manual description. |
| docs/pages/careers/react-community-engineer.js | Removes legacy page wrapper. |
| docs/pages/careers/product-marketing-manager.md | Removes manual description. |
| docs/pages/careers/product-marketing-manager.js | Removes legacy page wrapper. |
| docs/pages/careers/product-manager.md | Removes manual description. |
| docs/pages/careers/product-engineer-store.md | Removes manual description. |
| docs/pages/careers/product-engineer-store.js | Removes legacy page wrapper. |
| docs/pages/careers/people-operation-manager.md | Removes manual description. |
| docs/pages/careers/head-of-operations.md | Removes manual description. |
| docs/pages/careers/full-stack-engineer.md | Removes manual description. |
| docs/pages/careers/engineering-manager.md | Removes manual description. |
| docs/pages/careers/developer-experience-engineer.md | Removes manual description. |
| docs/pages/careers/developer-advocate.md | Removes manual description. |
| docs/pages/careers/designer.md | Removes manual description. |
| docs/pages/careers/design-engineer.md | Removes manual description. |
| docs/pages/careers/design-engineer-x-grid.md | Removes manual description. |
| docs/pages/careers/code-infra-engineer.md | Removes manual description. |
| docs/pages/careers/code-infra-engineer.js | Removes legacy page wrapper. |
| docs/pages/careers/account-manager.md | Removes manual description. |
| docs/pages/careers/account-manager.js | Removes legacy page wrapper. |
| docs/pages/careers/account-executive.md | Removes manual description. |
| docs/pages/careers/account-executive.js | Removes legacy page wrapper. |
| docs/pages/careers/accessibility-engineer.md | Removes manual description. |
| docs/pages/careers/accessibility-engineer.js | Removes legacy page wrapper. |
| docs/pages/careers/404.tsx | Adds careers-specific error page. |
| docs/pages/careers.tsx | Reads synchronized listings and count. |
| docs/next.config.ts | Delegates role paths to static generation. |
| docs/data/careers/roles.json | Adds initial careers snapshot. |
| .github/workflows/sync-website-content.yml | Combines team and careers synchronization. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| <MarkdownElement> | ||
| <h1>{job.title}</h1> | ||
| {/* eslint-disable-next-line react/no-danger -- Render the HTML description supplied by the careers API. */} | ||
| <div dangerouslySetInnerHTML={{ __html: job.description }} /> |
| { | ||
| "id": "1e96c9ba-ca98-41da-93ea-77459c509699", | ||
| "title": "Director of Business Operations", | ||
| "description": "<h2><strong>Details of the role</strong></h2><ul><li><p><strong>Location</strong>: Remote (preference for UTC-6 to UTC+5).</p></li><li><p><strong>Type of work</strong>: Full-time (contractor or employee <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui-org.notion.site/Hiring-FAQ-64763b756ae44c37b47b081f98915501#494af1f358794028beb4b7697b5d3102\"><u>depending on circumstances</u></a>).</p></li><li><p><strong>Level</strong>: <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui-org.notion.site/Leveling-at-MUI-5c30f9bfe65149d697f346447cef9db1\"><u>IC5 Staff and above</u></a>.</p></li><li><p>We're a <strong>remote</strong> company, operating mostly asynchronously.</p></li></ul><p></p><h2>The company</h2><p>MUI's story began in 2014 with Material UI, the most successful React implementation of Google's Material Design. This open-source project has paved the way for the fully-fledged startup known as MUI (founded in 2019), which now boasts an ever-expanding ecosystem of React UI products. We're a company of 40 people as of 2026, and we're growing steadily.</p><p></p><h2>The products</h2><p>MUI is best known for our flagship product, Material UI—but this is just one of the UI libraries we maintain. Material UI is complemented by advanced components through MUI X (Data Grid, Charts, Date and Time Pickers, Tree View) for more complex user interactions and data visualization needs. Base UI is our headless component library. We also host Design Kits and pre-built Templates.</p><p></p><h2>The culture</h2><p>MUI is a fully remote company with a team that spans the globe. The majority of our work is asynchronous, and we rely on written communication to collaborate. We're radically transparent: a lot of our work happens in public. Each contributor has the freedom to decide how and when they work, and that work is primarily self-directed: it's your responsibility to define and complete your own tasks in a timely manner.</p><p>For additional details about the culture, you can check our <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui.com/careers/\"><u>careers</u></a> and <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui.com/about/\"><u>about</u></a> pages and also our <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui-org.notion.site/\"><u>public Handbook</u></a>.</p><p></p><h2><strong>Why we're hiring</strong></h2><p>As MUI scales past 40 people, our biggest bottleneck is increasingly execution in business operations. Without a dedicated business operations leader, executive bandwidth gets tied up in day-to-day tasks rather than high-leverage decisions, critical cross-functional projects stall between departments, etc.</p><p>We are hiring a Director of Business Operations to offload executive operations from the CEO and build the machinery required for our products to reach their full potential. In this role, you will take on critical initiatives, ensure that cross-functional friction is resolved, and enforce a high bar of execution across the entire business.</p><p>Overall, both our open-source community and our premium products are growing fast. We need talented people to keep up with the demands of our exigent community!</p><p></p><h3><strong>Why this is interesting</strong></h3><p>You will operate at the intersection of business, revenue, system design (for example, AI), strategy, and organization design. You won't manage processes—you will lead a team that builds scalable foundations, untangles complex cross-functional friction (across Finance, Marketing, Product, Sales, People, Finance, and Engineering), and incubates new capabilities (like RevOps or internal tooling migrations) from 0 to 1.</p><p>If you love first-principles problem-solving, data, obsessing over operational details, and building living systems that save organization-wide time at scale, this role offers large autonomy and high strategic leverage. We care deeply about precision, excellence, and deep focus on the inputs (not the outputs): \"How you do anything is how you do everything.\"</p><p>Our products empower React developers to build awesome applications faster – we see millions of developers on MUI's docs every year, one million a month.</p><p></p><h2><strong>The role</strong></h2><h3><strong>Key responsibilities</strong></h3><p>Depending on the day, you'll:</p><ul><li><p><strong>Track performance & resolve bottlenecks:</strong> Monitor company KPIs, detect operational risks early, and deploy targeted interventions to solve root causes across departments.</p></li><li><p><strong>Lead operational scaling & systems design:</strong> Build, optimize, and automate scalable workflows, OKR cadences, and operating systems. Manage the Operations Engineer and temporarily own critical functions like interim RevOps.</p></li><li><p><strong>Lead people:</strong> Manage a team of operational contributors (including an operations engineer, people partner, operations manager), unblocking their daily work and setting clear execution standards.</p></li><li><p><strong>Drive special projects (0-to-1):</strong> Lead high-priority strategic experiments, expansions, or internal turnarounds from inception through execution to smooth handoff.</p></li><li><p><strong>Break down cross-functional silos:</strong> Facilitate seamless collaboration across Product, Sales, Engineering, and Finance to eliminate friction and increase decision-making velocity.</p></li><li><p><strong>Act as an executive proxy & advisor:</strong> Partner directly with the CEO and leadership team to offload executive initiatives, align company scorecards, and run core operating forums.</p></li></ul><p>Overall, expect the role to be 60% execution, 40% team management.</p><p></p><h2><strong>Who we're looking for</strong></h2><h3><strong>Required</strong></h3><ul><li><p><strong>High-agency & cross-functional judgment:</strong> Self-directed problem solver who thrives in ambiguity and can prioritize among many opportunities. See <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui-org.notion.site/Managers-of-one-00432bb0f6cf4667ae4ce9dd4cca23d3\"><u>Manager of one</u></a>.</p></li><li><p><strong>High conscientiousness & detail rigor:</strong> Strong commitment to eventually reach no-defect execution; double-checks everything, maintains clean documentation, focuses on friction-free user experiences.</p></li><li><p><strong>Executive presence & business acumen:</strong> Sound financial judgment, strong understanding of unit economics/gross margins, and the communication skills required to align senior leaders without direct line authority.</p></li><li><p><strong>First-principles analytical rigor:</strong> Proven track record of breaking down complex, ambiguous operational problems into root causes rather than treating superficial symptoms.</p></li><li><p><strong>Hands-on data literacy & systems design:</strong> Strong experience designing metrics, operating cadences (OKRs, WBRs/QBRs), and working alongside data/analytics engineers or tool stacks to establish single sources of truth.</p></li><li><p><strong>Strategic execution & ownership:</strong> Demonstrated success leading cross-functional strategic projects from scratch to a stable handoff, or taking on interim functional lead roles.</p></li><li><p><strong>Relentless drive for excellence</strong>: Follow the Boy Scout philosophy. You naturally leave every document, system, or workflow in better shape than you found it, proactively paying down operational debt.</p></li></ul><h3><strong>Nice to have (but not required)</strong></h3><ul><li><p>Former founder, Chief of Staff, or operations lead experience at a scaling startup (40–100 employees).</p></li><li><p>Hands-on experience with modern analytics stacks (for example, SQL, Python).</p></li><li><p>Prior experience in a developer tools or open-core business.</p></li></ul><p></p><h2><strong>Benefits and compensation</strong></h2><p>We offer competitive compensation commensurate with your experience level and location and are prepared to pay top market rates for someone who can clearly exceed the role's expectations. You can find the other perks and benefits on the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://mui.com/careers/#perks-and-benefits\"><u>careers</u></a> page.</p><p></p><p>Don't meet every requirement? Apply anyway! Research shows that certain folks are less likely to apply for a role than others <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://hbr.org/2014/08/why-women-dont-apply-for-jobs-unless-theyre-100-qualified\"><u>unless they meet 100%</u></a> of the outlined qualifications. If this role excites you, we want to hear from you. We'd love for you to share the unique skills, passion, and experience you could bring to MUI.</p><h2></h2>", |
Sync published role descriptions after adding HTML sanitization to the shared careers API.
28667e1 to
6e0b619
Compare
Keep future openings separate from active roles and their count. Hide the future section when empty and support both role page sets. Refresh the snapshot from the deployed careers API preview.
Keep the fixed Ashby application link available when no future roles are listed.
Create separate sync PRs for master and v9.x. Use each base for checkout and formatting, and skip careers until its integration is backported to the target branch.
mnajdova
left a comment
There was a problem hiding this comment.
Amazing, thanks for picking this up 👌
|
Cherry-pick PRs will be created targeting branches: v9.x |



Careers openings and role descriptions are currently maintained by hand in the docs. Sync them from the shared careers API so changes in Ashby can update the website without editing each role page.
docs/data/careers/roles.jsonsnapshot. Split current and future roles intorolesandfutureRolescategory arrays using the API flag. Prepare the current-role count and role URLs during sync; only current roles contribute to the open-role badge./careers/roles/[slug], including the full HTML description and application link.masterandv9.x, creating a separate[website] Sync website contentPR for each base. Format against the selected base and use distinct head branches. Branches without the careers sync script receive team updates only until the careers integration is backported.Depends on mui/mui-public#1926 being deployed before the production sync endpoint is available. The snapshot was refreshed from its deployed preview API after adding HTML sanitization.
Preview:
Validation:
Local verification: mock future data verified both sections, the current-role badge, future-role detail pages, and the empty-future fallback. The committed snapshot was then resynced from the API preview: two current roles and no future roles.