Installation
Remix 3 can be installed using any JavaScript package manager. The framework is distributed as a single remix package that includes all core functionality, or you can install individual packages as needed.
Requirements
Remix 3 requires Node.js v25 or higher when using Node.js as your runtime.
For other runtimes:
Bun : Any recent version
Deno : Any recent version
Cloudflare Workers : Compatible with the Workers runtime
Package Managers
Install Remix 3 using your preferred package manager:
Individual Packages
You can also install individual packages if you only need specific functionality:
npm install @remix-run/fetch-router
When using individual packages, make sure to install all required dependencies. Check each package’s documentation for its specific requirements.
TypeScript Configuration
Remix 3 is written in TypeScript and includes full type definitions. For the best development experience, configure your tsconfig.json:
{
"compilerOptions" : {
"target" : "ESNext" ,
"module" : "ESNext" ,
"moduleResolution" : "bundler" ,
"strict" : true ,
"esModuleInterop" : true ,
"skipLibCheck" : true ,
"forceConsistentCasingInFileNames" : true ,
"verbatimModuleSyntax" : true ,
"lib" : [ "ESNext" ]
}
}
Runtime-Specific Setup
Node.js
For Node.js applications, you’ll need the @remix-run/node-fetch-server package to create HTTP servers:
Create a basic server:
import * as http from 'node:http'
import { createRequestListener } from 'remix/node-fetch-server'
import { router } from './app/router.js'
const PORT = 3000
let server = http . createServer (
createRequestListener ( async ( request ) => {
return await router . fetch ( request )
})
)
server . listen ( PORT , () => {
console . log ( `Server running at http://localhost: ${ PORT } ` )
})
Run with native TypeScript support (Node.js v25+):
Bun
Bun has built-in TypeScript support and a native HTTP server:
import { router } from './app/router.js'
const PORT = 3000
Bun . serve ({
port: PORT ,
async fetch ( request ) {
return await router . fetch ( request )
},
})
console . log ( `Server running at http://localhost: ${ PORT } ` )
Run with:
Deno
Deno works directly with Remix 3’s web standard APIs:
import { router } from './app/router.ts'
const PORT = 3000
Deno . serve ({ port: PORT }, async ( request ) => {
return await router . fetch ( request )
})
console . log ( `Server running at http://localhost: ${ PORT } ` )
Run with:
deno run --allow-net main.ts
Cloudflare Workers
For Cloudflare Workers, use Wrangler for development:
Create a worker:
import { router } from './app/router.js'
export default {
async fetch ( request : Request ) : Promise < Response > {
return await router . fetch ( request )
} ,
}
Configure wrangler.toml:
name = "my-remix-app"
main = "worker.ts"
compatibility_date = "2024-01-01"
Run locally:
Installing Preview Builds
To try the latest development version from the main branch, use pnpm (version 9+):
pnpm install "remix-run/remix#preview/main&path:packages/remix"
For individual packages:
pnpm install "remix-run/remix#preview/main&path:packages/@remix-run/fetch-router"
Preview builds are bleeding-edge and may contain unstable features. Use them for testing and experimentation, not production.
Verify Installation
Create a simple test file to verify your installation:
import { createRouter } from 'remix/fetch-router'
import { route } from 'remix/fetch-router/routes'
let routes = route ({
home: '/' ,
})
let router = createRouter ()
router . get ( routes . home , () => {
return new Response ( 'Remix 3 is working!' )
})
let response = await router . fetch ( new Request ( 'http://localhost/' ))
console . log ( await response . text ()) // "Remix 3 is working!"
Run it:
If you see Remix 3 is working! in your console, you’re all set!
Next Steps
Quick Start Build your first Remix 3 application
Core Concepts Learn about routing, middleware, and architecture