Interview Insights · Full Stack Developer
How I Spot a Copy-Pasted Full Stack Developer Project in Minutes
Quick summary — Copied projects
Copied code is easy to spot because nobody can explain decisions they never made. Learning from tutorials is normal, and I do not reject anyone for it. What I look for is whether the candidate understands and owns the code. A copied project shows up through a single giant commit, a default README, packages that are installed but never used, and answers like 'it was already like that'. The quickest test is a small live change: add a filter, rename a field, fix a bug. Owners find the right file in seconds. Copiers search. This page shows the checks and how to make your project truly yours.
In this guide you will learn:
- Repository signals that suggest a project was cloned
- Walkthrough questions that reveal whether you can navigate your own code
- Why questions about schema and library choices
- The live change test and how to prepare for it
- How to extend a tutorial project so it becomes genuinely yours
SECTION 01What the repository tells me before you speak (Full Stack Developer)
I usually open the GitHub link a few minutes before the interview. A short scan answers many questions. When was the repository created, and how many commits does it have? Is the README the default text from the project generator, or does it explain what the app does? Does package.json list libraries that are never imported anywhere?
None of these signals proves copying on its own. A student might have built everything locally and pushed once. But together they shape my questions. If I see a single 'initial commit' with fifty files, I will spend more time on walkthrough questions to check ownership.
| Signal | What I see | Innocent explanation | What I will ask |
|---|---|---|---|
| Commit history | One commit with the whole app | Built offline, pushed once | Walk me through how you built it, step by step |
| README | Default generator text | Forgot to update it | What does this app do and how do I run it? |
| Dependencies | Libraries never imported | Tried and abandoned | Why is this package here? |
| Naming | Names match a well-known tutorial | Followed a course | What did you add beyond the course? |
# How does your history look to an interviewer?
git log --reverse --format="%ad %s" --date=short | head -10
# Unused dependencies in a Node project
npx depcheck
# Is a package really imported anywhere?
grep -rn "from 'redux'" src/ || echo "redux never imported"
# Leftover default text from a generator?
head -5 README.md# ShopLite
A small store app where users browse products,
add them to a cart and place orders. Admins can
add products and update order status.
## What I built myself
- Order status flow (PLACED -> PACKED -> SHIPPED)
- Product search with category filter
- Admin dashboard with daily order count
## Run locally
1. cp .env.example .env and fill in values
2. npm install in /server and /client
3. npm run dev in both folders
## Stack
React, Express, MongoDB (Mongoose), JWT auth
A section like 'What I built myself' is powerful. It answers my biggest question before I ask it, and it tells me exactly which parts to probe.
SECTION 02Walkthrough and why questions that expose copying
Next, I ask the candidate to share their screen and show me where something lives. Where is the code that calculates the cart total? Where do you check that only admins can add products? Someone who built the app goes straight to the file. Someone who copied it opens folder after folder.
Then come the why questions, aimed at decisions. Why is price stored on the order item and not only on the product? Why did you use Mongoose populate here? Why is this state in Redux and not in the component? There is no single right answer. I want to hear a reason that belongs to this project, not a definition.
| Question | Owner's answer | Copier's answer | What it reveals |
|---|---|---|---|
| Where is the cart total calculated? | Opens cartSlice.js, points to selector | Searches several folders | Familiarity with own code |
| Why store price on the order item? | Product price can change later | That is how it was | Understands data over time |
| Why use populate here? | To show product names on the order page | Mongoose needs it | Knows what the query does |
| What breaks if I delete this middleware? | Admin routes become public | Not sure | Understands request flow |
// models/Order.js (Mongoose)
const orderItemSchema = new mongoose.Schema({
product: { type: mongoose.Schema.Types.ObjectId, ref: 'Product', required: true },
name: { type: String, required: true }, // copied at order time
price: { type: Number, required: true }, // copied at order time
quantity: { type: Number, required: true, min: 1 }
}, { _id: false });
const orderSchema = new mongoose.Schema({
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
items: { type: [orderItemSchema], validate: v => v.length > 0 },
status: { type: String, enum: ['PLACED', 'PACKED', 'SHIPPED', 'DELIVERED'], default: 'PLACED' },
total: { type: Number, required: true }
}, { timestamps: true });
module.exports = mongoose.model('Order', orderSchema);"I copy name and price into each order item,
because if the admin changes the product price
next week, old orders must still show what the
customer actually paid.
I keep the product reference too, so I can link
back to the product page.
Status is an enum so a typo like 'SHIPED' is
rejected by validation.
timestamps gives me createdAt for the admin
dashboard's daily order count."
Every line of that explanation is a decision with a reason. Even if a tutorial suggested the same schema, a candidate who can explain it like this clearly understands and owns it.
SECTION 03The live change test and how to pass it
The most reliable check is a small live change. I might ask you to add a 'price under 500' filter to the product list, show the order date on the orders page, or fix a deliberately simple bug. The task is tiny on purpose. I am not testing speed. I am watching whether you know where to go, how you run the app, and how you check that the change worked.
To prepare, make sure your project runs on your laptop on the day, with the database seeded and environment variables set. Many candidates lose this test not because they copied, but because the app will not start and they have not run it in months.
| Live task | Files touched | What an owner does | Common stumble |
|---|---|---|---|
| Add a max price filter | Product route, product list component | Adds a query param and a Mongo condition | Filters on the frontend only, after loading everything |
| Show order date | Orders page component | Formats createdAt from timestamps | Does not know createdAt exists |
| Make email unique | User model | Adds unique index, handles duplicate error | Checks in code only, with a race |
| Fix a broken route | Routes file | Reads the error in the terminal first | Changes random code hoping it works |
// GET /api/products?maxPrice=500&category=books
router.get('/products', async (req, res, next) => {
try {
const filter = {};
const max = Number(req.query.maxPrice);
if (Number.isFinite(max) && max > 0) {
filter.price = { $lte: max };
}
if (req.query.category) {
filter.category = String(req.query.category);
}
const products = await Product.find(filter)
.select('name price category')
.sort({ price: 1 })
.limit(50);
res.json(products);
} catch (err) {
next(err);
}
});// ProductList.jsx (fetch part only)
const [maxPrice, setMaxPrice] = useState('');
const [products, setProducts] = useState([]);
useEffect(() => {
const params = new URLSearchParams();
if (maxPrice) params.set('maxPrice', maxPrice);
fetch(`/api/products?${params.toString()}`)
.then(res => res.json())
.then(setProducts)
.catch(() => setProducts([]));
}, [maxPrice]);
// A number input calls setMaxPrice(e.target.value).
// Filtering on the server means we never download
// products the user will not see.
Notice the String() around the category value. Passing raw query values into a Mongo filter can let someone send an object instead of a string. Mentioning that while you code is a small but strong ownership signal.
SECTION 04Make your tutorial project genuinely yours
If your project began as a course or tutorial, that is a fine start. The goal now is to add enough of your own decisions that you can defend it confidently. Use these three sheets over the next couple of weeks.
ADD AT LEAST TWO OF THESE YOURSELF
[ ] A new field with validation (e.g. order notes)
[ ] A filter or search on the server side
[ ] A status flow with allowed transitions
[ ] Pagination on a list API
[ ] An admin-only route with its own middleware
[ ] Form error messages from the API shown in the UI
[ ] One API test for a success and an error case
[ ] A seed script for demo data
Commit each one separately with a clear
message. Your history now tells the story.FIVE DECISIONS I CAN DEFEND
1. Decision: _____________________________
Because: _____________________________
2. Decision: _____________________________
Because: _____________________________
3. Decision: _____________________________
Because: _____________________________
4. Decision: _____________________________
Because: _____________________________
5. Decision: _____________________________
Because: _____________________________THE NIGHT BEFORE THE INTERVIEW
[ ] Fresh clone runs with the README steps
[ ] .env.example lists every variable needed
[ ] Seed script fills demo data
[ ] I can find any feature's file in seconds
[ ] I made one small practice change and reverted it
[ ] README has a 'What I built myself' section
[ ] I can say honestly which parts came from a course
SECTION 05Habits that make ownership obvious
Owners of a project leave clear traces in how they talk and how they work. Build these habits into every project from now on.
- Be upfront about the source — Say early that the base came from a course and then describe what you added. It removes suspicion and focuses the conversation on your work.
- Commit as you build — Small commits with clear messages create a visible build story that supports every claim on your resume.
- Delete what you do not use — Remove unused packages, components and routes. Every leftover is a question you cannot answer.
- Know your run commands — Be able to start the backend and frontend, seed data and run tests without looking anything up.
- Break and fix it once — Introduce a bug on purpose and debug it. The experience gives you a real story for 'tell me about a bug you fixed'.
SECTION 06Interview Q&A — Copied projects
Q1Is it wrong to build my portfolio project from a tutorial?
No. Tutorials are a normal way to learn. The issue is presenting tutorial code as fully original and being unable to explain it. Say where the base came from, show what you added, and make sure you understand every file you keep.
Q2Why would you copy price into an order item instead of referencing the product?
Because product prices change over time. The order must record what the customer actually paid at that moment. Keeping a product reference as well lets me link back to the product, but the historical price lives on the order.
Q3Why filter on the server instead of the frontend?
Filtering on the server means the database does the work, usually with an index, and the client only downloads the matching rows. Filtering in the browser means loading everything first, which gets slow and wasteful as the data grows, and can expose data the user should not see.
Q4How do you make an email field unique in MongoDB with Mongoose?
I add unique: true on the schema field, which creates a unique index, and make sure the index is actually built in the database. Then I handle the duplicate key error, code 11000, and return a clear 409 response. Checking in code alone is not enough because two requests can race.
Q5What would you check first if a route suddenly returns 500?
I read the error and stack trace in the server terminal or logs, because it usually names the file and line. Then I reproduce the request with the same input, often with a tool like curl or Postman, and add logging around the failing step if the cause is still unclear.
SECTION 07Test yourself — Copied projects quiz
Five questions. No sign-up.
0 / 5Pick an answer to see why it is right or wrong.
SECTION 08Frequently asked questions
Can interviewers tell if a project is copied from YouTube?
Often, yes. Well-known tutorial projects have recognisable names and structures, and copied projects usually come with a thin commit history. More importantly, the candidate struggles with why questions and small live changes.
How do I make a tutorial project unique for my resume?
Add features the tutorial did not cover, such as server-side filtering, pagination, a status flow or tests. Commit each one separately and describe them in a 'What I built myself' section of the README.
What questions are asked about projects in full stack interviews?
Expect questions about the architecture, database schema, authentication, one difficult bug, why you chose certain libraries, and how you would extend a feature. Some interviewers ask for a small live change.
Is it okay to mention that I followed a course for my project?
Yes. It is better to say it upfront and then explain what you changed or added. Interviewers value honesty and clear understanding more than claims of full originality.
How many projects should a fresher full stack developer have?
Quality matters more than count. Two or three projects you can explain deeply, run live and extend on request are stronger than many shallow ones.
How can I prepare for Full Stack Developer interview answers with a trainer?
Yes. Uncodemy's Full Stack Development Training Course in Noida (classroom and online) includes live projects, one-to-one mock interviews and resume reviews, so you practise Full Stack Developer interview answers with trainer feedback before the real interview. You can book a free demo class from this page to see how the sessions work.
SECTION 09Related reads
Classroom & online · Noida
Build projects you can defend line by line
Our Full Stack Development Training Course guides you through building full stack projects from scratch, with reviews that make sure you understand and own every decision.
Talk to a counsellor for current fees- Projects built step by step
- Code reviews by trainers
- Live change practice
- Weekday & weekend batches