diff --git a/README.md b/README.md
index 3e11dc3..c866479 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,35 @@
# Getting started
-Before starting, make sure you have a working python and nodejs setup with pyenv and nvm.
+Before starting, make sure you have Python 3.9 and Node.js 20 available.
```bash
-apt-get install libmysqlclient-dev
-pre-commit install
uv run manage.py migrate
-uv run bin/run
cp .env-default .env
+uv run manage.py seed_demo_data
-# in another terminal
-cd frontend
-npm install
-npm start
+# Optional: create an admin login
+uv run manage.py createsuperuser
+
+# Install frontend packages once
+cd frontend && npm install
```
+Start the backend and frontend in separate terminals from the project root:
+
+```bash
+uv run bin/run
+```
+
+```bash
+uv run bin/run-frontend
+```
+
+Vite prints the frontend URL when it starts (normally ; if that port is busy, it selects another). Django runs at ; open the admin directly at or through the frontend dev proxy at the printed Vite URL followed by `/admin/`. The GraphQL API is at ; the frontend uses Vite's proxy for development API requests.
+
+To test the frontend against a different backend, set `VITE_DEV_API_PROXY` when starting Vite, for example `VITE_DEV_API_PROXY=https://bbs.neuf.no uv run bin/run-frontend`. This affects the development proxy only; use caution with a live backend, since app changes and submissions may modify production data.
+
+To create the admin during data seeding instead, set `BBS_SEED_ADMIN_PASSWORD` for that command; the command only creates a local `admin` superuser if one does not already exist.
+
## References
- We use JS code generation to work with queries/mutations in our graphql API:
diff --git a/bin/run b/bin/run
index 4a65373..a7b6db9 100755
--- a/bin/run
+++ b/bin/run
@@ -1,3 +1,3 @@
#!/bin/bash
-python manage.py runserver
\ No newline at end of file
+exec python manage.py runserver 127.0.0.1:3000
\ No newline at end of file
diff --git a/bin/run-frontend b/bin/run-frontend
index 959292f..098589a 100755
--- a/bin/run-frontend
+++ b/bin/run-frontend
@@ -1,4 +1,3 @@
#!/bin/bash
-cd frontend && npm run start
-
+cd frontend && npm run start -- --host 127.0.0.1
diff --git a/frontend/src/client.ts b/frontend/src/client.ts
index 51ff67e..947a838 100644
--- a/frontend/src/client.ts
+++ b/frontend/src/client.ts
@@ -1,7 +1,7 @@
import { ApolloClient, InMemoryCache } from "@apollo/client";
const client = new ApolloClient({
- uri: `${import.meta.env.VITE_API_URL}/graphql/`,
+ uri: import.meta.env.DEV ? "/graphql/" : `${import.meta.env.VITE_API_URL}/graphql/`,
cache: new InMemoryCache(),
});
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
index c1147a7..72c0650 100644
--- a/frontend/vite.config.js
+++ b/frontend/vite.config.js
@@ -9,5 +9,13 @@ export default defineConfig({
__DEV__: process.env.NODE_ENV !== "production",
},
envDir: "..",
+ server: {
+ host: "127.0.0.1",
+ proxy: Object.fromEntries(
+ ["/admin", "/accounts", "/inventory", "/report", "/static", "/media", "/graphql"].map(
+ (path) => [path, process.env.VITE_DEV_API_PROXY || "http://127.0.0.1:3000"],
+ ),
+ ),
+ },
build: { outDir: "../static", emptyOutDir: false },
});