
Some companies now run coding rounds where candidates may, or are expected to, use an AI assistant. The documentation is uneven. Canva has published how it runs its version, Google and Meta are described mainly through press reporting and candidate accounts, and several other companies say to assume no AI unless you are told otherwise. This guide separates what companies have said from what candidates report, walks through the formats that have been described, lists the skills the sources say are evaluated, shows how to work with an assistant during the round, and ends with a preparation routine. Policies change quickly, so treat the company details as a snapshot from October 2026 and confirm the rules for your own loop with your recruiter. For the wider picture of each company's loop, see GreatFrontEnd's frontend interview process at Google, Amazon and Meta. This guide goes further on the frontend layer.
Separate what companies have said from what candidates report, because most of the detail falls in the second group.
| Company | What the sources say | Type of source | Where it comes from |
|---|---|---|---|
| Canva | Expects frontend, backend and machine learning candidates to use AI tools such as Copilot, Cursor and Claude. A pilot "AI-Assisted Coding" competency replaced its Computer Science Fundamentals screen for backend and frontend roles. | Company statement | Canva engineering blog, June 2025 |
| Meta | A coding interview with an AI assistant available. A Meta spokesperson said the company is testing providing AI tools to applicants. | Press reporting and a spokesperson quote; round details from candidate reports | WIRED, from 404 Media, Business Insider, CoderPad |
| A pilot "code comprehension" round with an approved assistant, Gemini. The May report described junior to mid-level roles on select US teams. In October, internal documents indicated a wider rollout during 2026, though a spokesperson still called it a pilot. | Press reporting on internal documents | Business Insider, May 2026 and October 2026 | |
| Shopify | Its Head of Engineering said candidates in the remote interview process can use whatever tools they want. | Company statement, reported by a newsletter | The Pragmatic Engineer, July 2025 |
| An AI-assisted coding round alongside a traditional one. | Candidate reports, not LinkedIn | Hello Interview, February 2026 |
Canva is the best documented, because the company wrote the posts itself. For Meta, the version of its Full Loop Interview Guide linked from its careers site on 23 October 2026 asks candidates not to use unauthorized outside assistance, including AI tools like ChatGPT. So which Meta round allows an assistant is something your recruiter has to confirm, and the round mechanics in the next section are candidate reports, not Meta documentation.
Companies that allow an assistant in one round can forbid it in another, and several state the default in writing.
Do not assume. Ask in writing before the interview and keep the answer. Questions worth asking:
If the answer is still unclear when the session starts, ask the interviewer before you open the assistant, and say what you plan to use it for. Asking costs a few seconds, and the Amazon guidance above shows what using a tool where it was not permitted may lead to. Hello Interview's Meta guide reports that in the bug-fixing phase some interviewers explicitly say no AI while others leave it open, which is another reason to ask at the start of each phase.
The formats that have been documented or reported are different interview formats, not one universal process.
| Company | Format described | Type of source |
|---|---|---|
| Canva | Ambiguous, realistic product challenges that a single prompt cannot solve. An interviewer's post describes three phases: planning (ask about scope, clarify assumptions), development (use AI for skeleton code, research and routine work, while keeping the result at pull-request quality) and discussion (explain every decision and weigh alternatives). | Company statement |
| Meta | A CoderPad environment with a file explorer, an editor and an assistant panel, and three phases in one extended problem: fixing a bug, implementing a feature and optimizing. The assistant can answer in chat but cannot edit your files. | Candidate reports (Hello Interview) |
| A pilot code comprehension round in which an approved assistant, Gemini, is available. | Press reporting | |
| Shopify | Candidates in the remote process can use whatever tools they want. | Company statement |
| An AI-assisted round alongside a traditional coding round. | Candidate reports |
Canva's later post, AI Interview Success, names three approaches that do not shine: an "AI showcase" that loses sight of the task, a "feature marathon" that accepts output quickly, and a "hands-off" style that delegates too much.
Two things stand out from the candidate reports. First, the problems that candidates describe for Meta, LinkedIn and Shopify are mostly language-agnostic (mazes, caches, intervals, robots on a grid), and Canva describes its tasks only as ambiguous, realistic product challenges. So a frontend candidate may be asked to judge generated code in a language or domain that is not React, and the habit being scored carries across. Second, the mechanics differ by round: Hello Interview reports that Meta's AI-enabled round sits alongside a traditional coding interview, with some interviewers asking for no AI in the first phase. GreatFrontEnd's company guides cover each loop in more detail: Canva, Shopify and LinkedIn.
The sources that describe these rounds use different words, but they point at the same few skills. None of them publishes a standard scoring rubric. Canva's list of five questions and the line quoted from Google's internal document are the closest published statements, and Meta's four areas come from candidate reports, so each skill below is tied to the evidence for it.
| Skill | What the sources say |
|---|---|
| Breaking down an ambiguous task | Canva evaluates how well you break down ambiguous requirements, and its interviewer guidance describes strong candidates asking about scope, clarifying assumptions and sketching an approach before implementing. |
| Using AI selectively | Canva evaluates whether you know when and how to use AI effectively, and its guide describes using AI for skeleton code, research and routine work. |
| Validating generated code | Canva evaluates whether you can identify and fix issues in AI-generated code. Google's internal document, as reported by Business Insider, says interviewers evaluate "AI fluency, including prompt engineering, output validation, and debugging skills." Candidate reports about Meta, collected by Hello Interview, list verification as one of four areas. |
| Understanding unfamiliar code and debugging | Google's pilot is described as a code comprehension round. Candidate reports describe Meta's round as a bug fix, a feature and an optimization inside one extended problem. |
| Code quality and production standards | Canva evaluates whether you can make AI-generated code meet production standards. Meta candidates report code quality as one of the four areas. |
| Communicating trade-offs | Canva's discussion phase asks candidates to explain every technical decision and weigh alternatives. Meta candidates report communication as one of the four areas. |
Candidate reports about Meta's round, collected by Hello Interview, describe four areas in total: problem solving, code quality, verification and communication. The wording differs between sources, and the thread is the same: directing the tool, reading what it produces, checking it, and explaining your decisions.
This is the part you can practise. The sections below follow the order of the round: decide what to hand over, ask for something small, review what comes back, test it, explain it, and recover when the assistant is wrong. The code examples are practice material, not reported interview questions.
Canva's interviewer guide describes using AI for skeleton code, research and routine work while you keep ownership of the result. Think of the assistant as something that drafts and you as the person who decides. The three approaches Canva says do not shine are the ones to avoid: showing off prompting technique, racing through features, and handing the whole task to the tool.
Canva's engineering post says it redesigned its questions to be ambiguous and realistic because a single prompt cannot solve them, and its interviewer guidance describes strong candidates asking about scope, clarifying assumptions and sketching an approach before implementing. So the first minutes should go to the requirements, not the assistant.
Suppose the prompt is: "Build a user picker for a team settings page. You type a name and choose a person." Before generating anything, turn the ambiguity into questions for the interviewer:
Then agree on a small, demonstrable slice, for example "typing filters a list, arrow keys move, Enter selects, Escape closes", and say you will add the network layer second. Now the first prompt can be narrow. Compare a vague prompt with a bounded one:
Vague:Build a user picker in React.Bounded:Context: React and TypeScript. api.ts exportssearchUsers(query: string, signal: AbortSignal): Promise<User[]>.Task: write only the hook useUserSearch(query) that calls searchUsers andreturns { users, status } where status is 'idle' | 'loading' | 'error' | 'ready'.Constraints: older requests must not overwrite newer ones, a failed requestmust set status to 'error', and no new dependencies.Do not write the component yet.
The bounded prompt gives you something short enough to review line by line, and it names the failure modes you already know about. Say the plan out loud: "I am asking for the hook only, because I want to check the async handling before it touches the UI." That one sentence shows the planning and the control that Canva's interviewer guide describes. It also avoids the "feature marathon" pattern, where speed of accepting output replaces judgment.
Read what comes back as if a colleague had opened the pull request. Here is a version an assistant could plausibly give for the search results list:
import { useEffect, useState } from 'react';export function SearchResults({ query }: { query: string }) {const [results, setResults] = useState<string[]>([]);useEffect(() => {fetch(`/api/search?q=${encodeURIComponent(query)}`).then((res) => res.json()).then((data) => setResults(data.items));}, [query]);return (<ul>{results.map((item) => (<li key={item}>{item}</li>))}</ul>);}
It works when responses arrive in order. The React documentation describes the failure: if the user types "hello" quickly, the query changes through "h", "he", "hel", "hell" and "hello", each starting a fetch, and there is no guarantee about the order of the responses. If the "hell" response arrives after the "hello" response, setResults is called last with the wrong data. React's You Might Not Need an Effect calls this a race condition.
The documented fix is a cleanup function that marks the older effect's response as stale:
useEffect(() => {let ignore = false;fetch(`/api/search?q=${encodeURIComponent(query)}`).then((res) => res.json()).then((data) => {if (!ignore) setResults(data.items);});return () => {ignore = true;};}, [query]);
When query changes, React runs the previous effect's cleanup first, so the older closure sees ignore === true and skips setResults. You can also cancel the request itself with an AbortController: pass signal to fetch and call controller.abort() in the cleanup. Per MDN, an aborted fetch rejects with an AbortError, so your catch has to ignore that error name or you will report a failure the user never caused. Debouncing the input reduces the number of requests but does not by itself order the responses. GreatFrontEnd's React hooks interview questions cover the effect lifecycle that this fix depends on.
The same snippet has a second problem that the compiler will not report. MDN says a fetch() promise only rejects when the request itself fails, and does not reject when the server answers with an error status such as 404 or 504, so a then handler has to check Response.ok or Response.status. The same applies to a type assertion on res.json(): the TypeScript handbook states that type assertions are removed by the compiler and that there is no runtime checking (Everyday Types). GreatFrontEnd's TypeScript for React developers guide covers typing API data in more depth.
Other patterns worth a second look when an assistant produces frontend code are below. These are general review habits drawn from the linked documentation, not questions that any company has been reported to ask.
| Generated code | What to check | Source |
|---|---|---|
State updated with push, then setTodos(todos) | React compares new state with the old using Object.is and skips re-rendering if they are identical, so copy the array instead of mutating it. | useState, Updating Arrays in State |
key={index} on a list that changes | React says index keys often lead to subtle and confusing bugs when items are inserted, deleted or reordered. | Rendering Lists |
eslint-disable on exhaustive-deps | React says mismatched dependencies carry a very high risk of bugs. A state updater such as setCount((c) => c + 1) removes the dependency in an interval effect. | Removing Effect Dependencies |
<dialog open={isOpen}> | MDN says a dialog opened with the attribute is non-modal, and recommends show() or showModal(). | MDN dialog |
display: none on a real checkbox | MDN says it removes the element from the accessibility tree, and it cannot receive focus. Hide it visually instead, or style it with appearance: none. | MDN display |
height: 100vh for a phone layout | MDN says vh is currently equivalent to lvh, the size with the browser interface retracted, so content can be hidden behind it. svh is the safer default. | MDN length |
Controls that appear only on :hover | Many mobile devices emulate hover with an inconvenient long tap, and opacity: 0 leaves hidden controls in the tab order. Use @media (hover: hover) and :focus-within. | MDN hover |
dangerouslySetInnerHTML with user data | React says untrusted HTML risks XSS. MDN notes that innerHTML blocks injected <script> elements but not attributes such as onerror, so sanitize with a maintained library. | React common components, MDN innerHTML |
| Props copied into state | The initial state argument is ignored after the first render, and a value that can be calculated from props or state should be calculated during rendering. | You Might Not Need an Effect |
An assistant will often offer a test with its code. Check whether it can fail for the bug you care about. Here is one an assistant could plausibly write for the search component above:
import { render, screen } from '@testing-library/react';import { expect, it, vi } from 'vitest';import { SearchResults } from './SearchResults';it('renders results', async () => {vi.stubGlobal('fetch',vi.fn().mockResolvedValue({ json: async () => ({ items: ['hello world'] }) }),);render(<SearchResults query="hello" />);expect(await screen.findByText('hello world')).toBeInTheDocument();expect(fetch).toHaveBeenCalledTimes(1);});
(toBeInTheDocument comes from @testing-library/jest-dom.) It is green, and it proves very little. It passes against the racy component, because there is only one request and it resolves immediately. The mock is a plain object with a json method and no ok or status, so it is not shaped like a real Response. Here is the component with the stale-response fix and a status check combined:
export function SearchResults({ query }: { query: string }) {const [results, setResults] = useState<string[]>([]);const [error, setError] = useState<string | null>(null);useEffect(() => {let ignore = false;fetch(`/api/search?q=${encodeURIComponent(query)}`).then((res) => {if (!res.ok) throw new Error(`Request failed with status ${res.status}`);return res.json();}).then((data) => {if (!ignore) {setResults(data.items);setError(null);}}).catch((err: Error) => {if (!ignore) setError(err.message);});return () => {ignore = true;};}, [query]);if (error) return <p role="alert">{error}</p>;return (<ul>{results.map((item) => (<li key={item}>{item}</li>))}</ul>);}
Run the assistant's test against this version and it fails, because the component checks res.ok and the mock does not provide it. A test that fails on the corrected code and passes on the buggy code is coupled to the implementation, not to behavior.
React Testing Library's guiding principles say the more your tests resemble the way your software is used, the more confidence they can give. Start from the bug you found and write the test that would have caught it. Control the order of the responses yourself, and use real Response objects (Response.json() is a static helper):
import { act, render, screen } from '@testing-library/react';import { expect, it, vi } from 'vitest';import { SearchResults } from './SearchResults';function deferred<T>() {let resolve!: (value: T) => void;const promise = new Promise<T>((r) => (resolve = r));return { promise, resolve };}it('ignores a slow response for an older query', async () => {const slow = deferred<Response>();const fast = deferred<Response>();vi.stubGlobal('fetch',vi.fn().mockReturnValueOnce(slow.promise).mockReturnValueOnce(fast.promise),);const { rerender } = render(<SearchResults query="hell" />);rerender(<SearchResults query="hello" />);fast.resolve(Response.json({ items: ['hello world'] }));expect(await screen.findByText('hello world')).toBeInTheDocument();await act(async () => {slow.resolve(Response.json({ items: ['hell on earth'] }));await new Promise((r) => setTimeout(r, 0));});expect(screen.queryByText('hell on earth')).not.toBeInTheDocument();});it('shows an alert when the server returns 500', async () => {vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response('oops', { status: 500 })));render(<SearchResults query="hello" />);expect(await screen.findByRole('alert')).toHaveTextContent('status 500');});
Against the original component the first test fails, because the late "hell" response replaces the "hello" results, and the second fails because nothing renders an alert. Against the combined component above both pass. That is the proof you want to be able to describe: the test fails for the right reason before the fix and passes after. Also point out findByRole('alert'): Testing Library's query guidance recommends getByRole-style queries first because they reflect how assistive technology users experience the page. GreatFrontEnd's senior testing interview questions go further on test design.
The discussion phase in Canva's interviewer guide is where strong candidates can explain every technical decision, discuss improvements and weigh trade-offs. Canva's guide also tells candidates that if the interviewer asks a question, they should say what they think before getting help from AI. So the first move is to answer from your own understanding, and use the assistant only for the part you want to confirm.
A useful answer has three parts: what the code does, what it assumes, and how you checked it. Suppose the interviewer points at the ignore flag and asks why it is there.
| Weak | Stronger |
|---|---|
| "The assistant added it, I think it handles something with the effect." | "If the query changes from 'hell' to 'hello', both requests are in flight. React runs the old effect's cleanup, which sets ignore to true, so the late 'hell' response does not call setResults. I checked it with a test that resolves the requests in the wrong order." |
| "It works, the tests pass." | "It passes, but the first test the assistant wrote only had one request, so I added one that resolves out of order and one for a 500 response." |
Two habits make the discussion easier. Narrate before you run: "I expect this to fail on the 500 case because there is no status check", then confirm or correct that expectation out loud, which is the advice in GreatFrontEnd's process guide for the silence problem. And keep a short list of things you would improve with more time, such as error telemetry, retries or an abort signal, because Canva's interviewer guide says strong candidates can name areas that would need more work in production.
Some candidates in Hello Interview's Meta guide report that the assistant was less helpful in the interview than in practice. Whatever the cause, plan to be able to write and debug the code yourself, and say what you are doing: "this suggestion is wrong because it ignores the status check, so I will write that part." When you do not understand a piece of generated code, say so. Hello Interview's LinkedIn guide reports a candidate who told the interviewer she preferred to write a response herself because she could not fully follow the suggestion, and who received positive feedback for it. That is a report from one source and not a rule, though it matches Canva's emphasis on owning every line you submit.
eslint-disable comment in generated code is a question to answer, not a style choice.as assertion on res.json() hides a missing status check and a wrong shape.Build a repeatable routine, and make most of it independent of any one assistant.
Is an AI-assisted coding interview easier because the assistant writes code? Not according to the sources. Canva says it found that AI assistants can trivially solve traditional coding interview questions, so it moved to more complex, ambiguous tasks, and it still expects you to take full ownership of any code you produce. Hello Interview reports that Meta candidates describe the implementation phase as harder than a medium LeetCode problem.
Which assistant or editor should I use? It depends on the company. Canva's interviewer guide suggests having your preferred AI-integrated editor and a basic project structure ready. In Hello Interview's Meta report, the assistant and models are provided inside the interview environment and recruiters can share a practice environment. Ask your recruiter which applies.
Do I still need to practise without an assistant? Yes. Some rounds do not allow one, and Hello Interview reports that Meta's AI-enabled round sits alongside a traditional coding interview, with some interviewers asking for no AI in the first phase.
Is there a standard scoring rubric? None of the sources I read publishes one. Canva lists five questions it evaluates, Google's internal document is quoted by Business Insider, and Meta's four areas are candidate reports.
The AI-assisted coding interview that frontend candidates face is documented unevenly: Canva has published its approach, Google and Meta are described mainly through reporting and candidate accounts, Shopify's Head of Engineering has spoken about it, and several other companies say to assume no AI unless told otherwise. What the sources share is a bar centered on what you do with the output: ask about requirements first, give the tool bounded work, read what comes back, check it with a test that can actually fail, and explain it as your own code. Get the rules in writing, practise in a codebase you did not write, and keep the fundamentals sharp for the rounds that do not allow an assistant.
The frontend interview process at Google, Amazon, and Meta: each company's official prep guide, a round-by-round comparison table, and the 2026 AI-assisted rounds.
A frontend-focused guide to machine coding round questions, including what is machine coding round, how to prepare for machine coding round interviews, and how to practice in React.
Frontend debugging interview questions with answers: dead clicks, breakpoints, source maps, overflow, the CSS cascade, CORS, jank, memory leaks, Safari and races.
Master TypeScript React best practices by avoiding these 12 common mistakes. Learn proper component typing, hooks patterns, and API integration techniques.
Prepare for frontend web security interview questions with scenario-based answers on XSS, CSRF, CORS, cookies, CSP, token storage, browser boundaries, and secure UI habits.
Senior testing developer interview questions on flaky tests, mocking, coverage, and E2E architecture, with worked answers and real, sourced examples throughout.