This episode is hands-on practice: creating a project with npx create-remix, understanding the folder structure and vite.config.ts, running the dev server with hot reload, and configuring TypeScript, ESLint, and Prettier so the project is ready for development.

The first two episodes built understanding. From this episode on, you'll be typing yourself. The end goal is simple: a working Remix project, neatly organized, and ready to be filled with the concepts that follow.
Remix uses the official create-remix scaffolder to build the project skeleton. The interesting part: the scaffolding result is minimal — not a giant boilerplate with hundreds of files, but a slim structure you can understand file by file. This aligns with Remix's philosophy of emphasizing flow understanding over layered abstraction.
Episode 3 takes you from empty to a running project: creating the project, reading the folder structure, running the dev server, then tidying up the TypeScript, ESLint, and Prettier configuration.
Open your terminal, navigate to the folder where you keep your projects, then run the following command:
npx create-remix@latest belajar-remix-appThe npx create-remix@latest belajar-remix-app command downloads the scaffolder and shows an interactive wizard. npx ensures you use the latest version, so you don't need to install the scaffolder globally.
The wizard will ask several options that affect the project structure:
npm install manually after scaffolding finishes.Tip
Note down the answers you choose. The difference in choices only determines which adapter file is generated — the core structure like app/routes stays the same regardless of platform.
After scaffolding finishes, open the generated folder:
belajar-remix-app/
app/
routes/
entry.client.tsx
entry.server.tsx
root.tsx
public/
.eslintrc.cjs
.prettierrc
package.json
tsconfig.json
vite.config.tsNotice there's no remix.config.js — since Remix v3, configuration uses vite.config.ts. The files entry.client.tsx and entry.server.tsx are the application's entry points in the browser and on the server.
Open vite.config.ts. Its contents are concise: the Remix plugin and the experimental server declaration if used.
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
export default defineConfig({
plugins: [remix(), tsconfigPaths()],
});This configuration tells Vite to use the Remix plugin as the main bundler. The remix() plugin from @remix-run/dev manages the entire build, dev server, and route manifest.
With dependencies installed, run the following command:
npm run devAfter a few seconds, Vite will set up the server and display a URL. Open http://localhost:3000 in your browser. If the Remix welcome page appears, your project is running correctly.
Change some text on the home page, for example in app/routes/_index.tsx, then save. The browser updates immediately without a full reload. This is Hot Module Replacement (HMR) at work: module changes are sent to the browser in real time, while the unchanged page state is preserved.
This Vite-based Remix dev server also handles server-side file changes — loaders, actions, and other server modules are reloaded automatically. No need to restart the server manually.
The scaffolding project already uses TypeScript with strict: true in tsconfig.json. strict: true forces you to write types explicitly, so bugs in loaders, actions, and component props are caught at writing time. The habit of typing all data that comes out of a loader will pay off greatly in episodes 10 and 18.
{
"compilerOptions": {
"strict": true,
"jsx": "react-jsx",
"types": ["@remix-run/node"]
},
"include": ["**/*.ts", "**/*.tsx"]
}The scaffolder provides an ESLint configuration based on Remix's eslint-config-react-app. Run checks and automatic fixes through the available scripts:
npm run lint
npx prettier --write .The npm run lint command checks for potential bugs and inconsistent patterns, while npx prettier --write . tidies up formatting across all files. Get into the habit of running both before committing — clean lint and formatting will make code review easier in team projects.
Episode 3 completes the setup: a Vite-based Remix v3 project is now running with a dev server, the folder structure is understood, and TypeScript, ESLint, and Prettier are ready to accompany development. The technical foundation is now truly ready.
The key takeaways:
npx create-remix@latest nama-app builds a project through an interactive wizard.npm run dev runs the dev server with HMR for both client and server.npm run lint and npx prettier --write . before committing.In the next episode, episode 4, we'll discuss routing and nested routes — Remix routing basics, layout sharing with Outlet, dynamic routes and catch-all routes, advanced route conventions, and navigation with Link and NavLink. This is where the folder structure we just created starts showing its strength.