1# Hetzner Website: React Router
2
3Deploys a [React Router](https://reactrouter.com) v7 (framework mode)
4site to Hetzner with `Hetzner.Website.ReactRouter` — no adapter setup in
5the project config.
6
7The Node adapter bundle runs as a systemd unit on a Hetzner Cloud Server (port 3000).
8
9
10- `app/routes/home.tsx` is server-rendered on the Hetzner Server and reads `GREETING` from `process.env`.
11- `app/components/Card.tsx` is a React component styled with Tailwind utilities.
12- Static assets under `public/` deploy with the service.
13
14```ts
15const site = yield* Hetzner.Website.ReactRouter("Website", {
16 env: { GREETING: "Hello from React Router on Hetzner!" },
17});
18```
19
20The integration package must be installed in the project (it is loaded
21dynamically at deploy time):
22
23```sh
24bun add -d @alchemy.run/frontend-frameworks
25```
26
27## Deploy
28
29```sh
30bun run deploy
31```
32
33Unchanged sources skip the build entirely on subsequent deploys — the
34input files are content-hashed (scoped by `memo.include`).
35
36## Dev
37
38```sh
39bun run dev
40```
41
42`alchemy dev` runs the framework's own dev server (HMR included) and
43no cloud resources are created.
44
45## Destroy
46
47```sh
48bun run destroy
49```