The Heroku demo is gone — free dynos were retired in November 2022 — so Robert now lives wherever you run him. See Running Robert below.
Robert was designed to be a virtual assistant. Robert just wants to make art. Step inside Robert's world, one large existential crisis and watch him attempt to find meaning. Relax, breath along with Robert. Maybe wake him up and stare into his one, large, blinking eye. Let Robert share with you what's on his mind (probably Danny DeVito) or enter his VR world and listen to him generate music just for you!
Robert needs Node 20.19 or newer (there is an .nvmrc if you use nvm).
npm run setup # installs both the server and the client
npm run dev # Express API on :5000, Vite dev server on :3000Then open http://localhost:3000. The dev server proxies /api to Express,
so both halves need to be running — npm run dev starts them together.
To run the way it deploys — one server, one port:
npm run build # builds the client into client/build
npm start # Express serves the API and the built client on :5000Robert's moods and projects come from MongoDB. Point MONGODB_URI at one
(copy .env.example to .env), and npm run seed will fill an empty database
with the sample records in data/seed.js.
With no database reachable, Robert still wakes up: the API serves that same
sample data so he has something on his mind. Writes return 503 until a
database is connected.
| Script | What it does |
|---|---|
npm run setup |
Installs server and client dependencies |
npm run dev |
Runs the API and the client dev server together |
npm run server |
API only, with nodemon |
npm run client |
Client dev server only |
npm run build |
Builds the client into client/build |
npm start |
Serves the API and the built client on one port |
npm run seed |
Loads data/seed.js into MongoDB |
npm run cf:dev |
Serves the built client and the Worker API locally |
Cloudflare has no long-running process, so npm start is not what runs there.
The Worker serves client/build as static assets, and worker/index.js
answers the four read-only endpoints the front end calls from the same
data/seed.js the local server falls back to. There is no database in that
deployment: writes return 405, and changing Robert's moods or projects means
editing data/seed.js and redeploying.
wrangler.toml holds the routing: /api/* reaches the Worker first, and
anything else that is not a real file falls back to index.html so /world
and /aboutrobert survive a refresh.
Settings for the Workers project:
| Setting | Value |
|---|---|
| Build command | npm run setup && npm run build |
| Deploy command | npx wrangler deploy |
| Root directory | / |
Node version comes from .nvmrc.
To check the whole thing locally the way Cloudflare will run it:
npm run build
npm run cf:devAfter waking Robert
- Three buttons appear below Robert after he is woken.
- Click on the middle button depicted as a sign.
- You are now entering Robert's world.
- The white circle in the middle of the screen is now your cursor.
- MOBILE: The cursor will move as you move your phone
- DESKTOP: Click the screen as you would a link, hold and move your mouse. This action will move the cursor.
- Wait for the cursor to shrink in size.
- When the cursor returns to normal size, you have successfully clicked on the object.
- Center the white circle (your cursor) over the right CENTER strawberry.
- After cursor signifies click (shrinks then grows), music should begin playing.
Music will play indefinitely until stopped by user
- Center the white circle (your cursor) over the left CENTER strawberry.
- After cursor signifies click (shrinks then grows), Robert should begin singing.
Robert will stop singing after finishing his "song"
- Center the white circle (your cursor) over the right OUTER strawberry.
- After cursor signifies click (shrinks then grows), music should stop playing.
Music will play indefinitely until stopped by user
- Center the white circle (your cursor) over the left OUTER strawberry.
- After cursor signifies click (shrinks then grows), Robert should stop singing.
Robert will stop singing after finishing his "song"
- Face the back of the world (opposite of strawberries).
- Place cursor over door below "No Exit Sign" and allow cursor to perform click.
- On success, user will be returned to home screen.
After Click
- User will see a theme listed below the Robert animation such as "Touch" or "Mother."
- A link will show at bottom of page reading, "SURPRISE".
- The "Surprise" link will navigate user to associated web page.
After Click
- Robert will ask user if they would like to see something else.
A-Frame, React, Node, Markov Chain for predictive speech, RiTa fed potential lyrics, Tonejs for synths, web speech API for Robert's voice, animations and Robert built from scratch with CSS.
More info lives on Robert's own /aboutrobert page once he is running.
Hannah Wenger
Email: hamecow@gmail.com
Please feel free to reach out or connect on Spotify! Always looking for collaborators, conversation, learning opportunities and new music

