Press enter or click to view image in full size
The story began in the summer of 2025, when I was discussing with DeepSeek an idea that had been in my head for almost 10 years: a social network of preferences, where users receive recommendations based on similarities in their personal ratings (restaurants, hotels, countries, hobbies, basically anything). And suddenly it said:
Let’s build it. We should use Next.js.
3 months later, I found myself presenting the product to the top management of a large corporation, and they were the ones who asked me to do it.
What’s funny is that despite 20 years in IT as a founder, that had never happened to me before.
More recently, I also brought another long-postponed project to launch, one that had been sitting in a folder for years. I always assumed it would be too complex and expensive to build, and the topic itself felt risky enough that I didn’t want to invest money into it.
In this series I’ll share the entire experience: real prompts, configurations and pitfalls. But before we go further, we need to answer the most important question:
Should you even try this?
Short answer — yes, if you roughly understand these concepts:
- frontend
- backend
- databases
- HTML structure
- CSS styling
- JavaScript behavior
- basic React concepts
If these ideas already make sense to you, feel free to move on to the next part.
If these terms sound unfamiliar, it’s better to take a moment to understand them now. What follows won’t feel like scrolling social media — but consider this: this journey saved me roughly $300,000 and a couple of years of development, hiring contractors and building a team.
Frontend vs Backend
In simple terms, frontend is what the user sees:
- a website in a browser
- a mobile application
- a browser extension
- any interface where users click buttons or read information
Press enter or click to view image in full size
The backend is the part of the system that runs on servers somewhere on the internet.
It handles:
- data processing
- authentication
- business logic
- communication with databases
When a user clicks a button, the frontend sends a request to the backend. The backend processes the request and sends data back.
The interaction looks roughly like this:
User → Frontend → Backend → Database → Backend → Frontend → User
What Is a Database?
The database stores the information used by the application. The idea is very similar to Excel or Google Sheets. A database is like a file with tables. Each table is a sheet inside that file.
Users| id | name | email |
| -- | ------- | ----------------- |
| 1 | Alice | alice@email.com |
| 2 | Bob | bob@email.com |
Articles
| id | user_id | title |
| -- | ------- | ----------------- |
| 1 | 1 | First article |
| 2 | 1 | Another article |
| 3 | 2 | Bob's article |
In this example, each user can create many articles.
This simple structure of related tables forms the foundation of most software systems. In your own service there might be 30–50 tables, even if right now it feels like there will only be three.
In reality, things are a bit more complex: there are indexes, keys, and access permissions. But AI usually sets this up on its own, and does it quite well.
HTML: Structure of the Page
HTML defines what exists on the page.
- headings
- paragraphs
- buttons
- images
- containers
Example:
<div>
<h1>Hello</h1>
<p>This is a paragraph</p>
</div>HTML elements form a nested structure called the DOM.
div
├── h1
└── pEvery webpage in your browser is essentially a large tree of elements.
CSS: How Things Look
If HTML defines structure, CSS defines appearance.
- colors
- fonts
- spacing
- layout
- positioning
Example:
/* CSS class that defines how the title looks */.title {
color: blue;
font-size: 32px;
}
Applied like this:
<!-- HTML heading that uses the CSS class above --><h1 class="title">Hello</h1>
Combining Multiple Classes
One important concept in CSS is that elements can have multiple classes.
Example:
<!-- button with multiple classes --><button class="button button-primary button-large">
Submit
</button>
Each class can control different aspects of styling.
/* base button style */
.button {
border-radius: 6px;
}/* button color style */
.button-primary {
background: blue;
color: white;
}
/* button size */
.button-large {
padding: 16px 24px;
}
This flexibility is powerful. But it can also become confusing in large applications when styles start interacting with each other.
Why Tailwind Helps
This is one reason many modern projects use Tailwind CSS. Instead of writing large CSS files, Tailwind uses predefined utility classes.
Example:
<button class="bg-blue-500 text-white px-6 py-3 rounded-lg">
Submit
</button><!-- bg-blue-500 = blue background -->
<!-- text-white = white text -->
<!-- px-6 = horizontal padding -->
<!-- py-3 = vertical padding -->
<!-- rounded-lg = rounded corners -->
Each class represents one small styling rule. This approach has a surprising advantage when working with AI tools like Cursor. AI tends to generate Tailwind layouts much more reliably than traditional CSS.
If you don’t explicitly instruct Cursor to use Tailwind, it may start embedding styles directly into each element.
Example:
<!-- style written directly inside the button element --><button style="background: blue; padding: 12px;">
This works initially.
But later it becomes painful, because changing the design requires editing every component individually. Reusable classes allow you to change the design of the entire application by modifying only a few shared styles.
JavaScript and TypeScript
HTML defines structure. CSS defines appearance. JavaScript defines behavior.
Press enter or click to view image in full size
JavaScript allows the interface to react to user actions.
Example:
// when the user clicks the button, show a messagebutton.addEventListener("click", () => {
alert("Hello!");
});
TypeScript is essentially JavaScript with additional type safety.
JavaScript:
// a simple function that adds two numbersfunction add(a, b) {
return a + b;
}
TypeScript:
// the same function, but with explicit types
// a and b must be numbers
// the function returns a numberfunction add(a: number, b: number): number {
return a + b;
}
Most modern applications use TypeScript because it prevents many errors in larger systems.
Why We Will Use Next.js
In the rest of this series we will build the example application using Next.js. Next.js is a framework built on top of React. React focuses on building user interfaces.
Next.js adds things like:
- routing
- server rendering
- API endpoints
- project structure
- build tools
You don’t need to deeply understand Next.js internals. But it helps to understand how React applications are structured.
Fortunately the core ideas are very simple. You only need to understand three things:
- components
- props
- hooks
React Components
React applications are built from components.
A component is a reusable piece of interface.
Examples include:
- buttons
- navigation bars
- comment blocks
- modal windows
Example component:
// A simple React component.
// It renders a button.function Button() {
return <button>Click me</button>
}
Now it can be reused anywhere.
<Button />
<Button />
<Button />Large applications become trees of components.
Press enter or click to view image in full size
Props
Props are inputs passed into components.
Example:
// A simple React component.
// It renders a button and shows the text passed in props.label.function Button(props) {
return <button>{props.label}</button>
}
Usage:
// The same component can be reused with different labels<Button label="Save" />
<Button label="Delete" />
<Button label="Cancel" />
Hooks
Hooks allow components to store state and react to user interactions.
Example:
// useState creates a piece of state inside the component.
// "count" stores the current value.
// "setCount" is the function used to update it.const [count, setCount] = useState(0)
Now the component can update its internal state.
// When the button is clicked, the count increases by 1.
// The text updates automatically.<button onClick={() => setCount(count + 1)}>
Clicked {count} times
</button>
Hooks make components interactive.
Summary
If you have never encountered these concepts before, I understand how this might feel.
But you don’t need to master all of this at a professional level. You only need to understand the basic idea. If you have a technical mindset and can grasp these concepts, the journey becomes much easier.
Instead of randomly asking AI to generate something, you will be able to guide it properly. And that makes a huge difference.