tropicalbee/Moonbase-Intern

A cinematic 3D browser game where you're a lunar station intern juggling system failures, emergency repairs, and escalating chaos. Try not to break anything.

JavaScript

0

3 commits

updated Oct 16, 2026

See the code

See what people are saying

SourceMessageScoreDate

built Moonbase Intern : a browser game where you have 7 minutes to stop a moonbase from falling apart..needs feedback to improve it !! (r/SideProject)

hey folks !!! so made a little 3d browser game using three.js where you spend 7 minutes trying to keep a moonbase running. power cuts, oxygen leaks, overheating equipment, a rover that refuses to cooperate... and somehow it's all your problem. built this in my free time as time pass.... it's only…

1

Oct 17, 2026

I made a 3D browser game where you're an intern on the Moon. Try not to destroy the station 💀 (r/coolgithubprojects)

7 minutes. One intern. A whole moonbase to manage. What could possibly go wrong? 😅 Meet Moonbase Intern, a small 3D game built with Three.js (and a lot of help from my AI coding agent). Power failures, oxygen emergencies, overheating labs, a troublesome rover, and a station AI that judges your…

0

Oct 16, 2026

README

Moonbase Intern: Please Don't Break Anything. The glass dome of Habitat 07 beneath the lunar sky.

Moonbase Intern

Seven minutes. Five systems. One very underqualified intern.

A first-person browser game about keeping a lunar research station alive until handover.

Three.js 0.180.0 Vite 8.3.2 JavaScript ES modules Code license: Apache 2.0 Status: V1

Play in your browser · Run locally · Architecture · Report a bug · Contribute

Created by @tropicalbee

1. Welcome to Habitat 07

You arrive at a glass-domed research station on the Moon. There are plants under the lights, a rover collecting samples, and equipment that seems unusually willing to introduce itself. Your assignment sounds straightforward: keep the station operational for one shift.

Then the warnings start.

Power, oxygen, lab cooling, communications, and Scout's drive can all develop faults. You have to reach the equipment, read its diagnostic panel, and carry out the repair while the shift clock keeps moving. Later incidents overlap, so deciding what to fix first matters as much as knowing which button to press.

Between alarms, meet Spike the security cactus, Sunny the desert marigold, Moss the tortoise, and the rest of the station. Their dialogue is authored, their opinions are plentiful, and some encounters lead beyond your maintenance checklist.

What you can do

  • Work a seven-minute shift. Progress through orientation, pressure, chaos, and a final-minute inspection.
  • Diagnose five systems. Fifteen repair procedures change the work itself, from isolating a leaking bank to correcting a rover's encoder drift.
  • Practice before the real shift. Training uses the same repair panels with protected reserves, hints, and repeatable fault variants, without writing a score.
  • Meet the residents. Looking toward a nearby resident triggers automatic dialogue; remarks also respond to station conditions.
  • Explore between incidents. Find three optional secrets without losing track of life support.
  • Compare another attempt. Review your grade, station condition, discoveries, and local personal best; replay the same seed or start fresh.

2. Your maintenance route

SystemService pointDiagnostic work
PowerWatt, the power cellIsolate tripped feeds, leaking banks, or bus back-feeds; reconnect a suitable supply.
OxygenCapsule, the research podBalance flows, bypass a blocked filter, or purge trapped pressure before priming.
CoolingPatch, the console inside the labRelieve pressure, reopen a blocked return, or calibrate a probe; synchronize the pump.
CommunicationsRelay's ground uplink at WattTune frequency and phase; some faults also require relay routing or polarity correction.
RoverScoutDiagnose motor current, brake drag, or encoder error; verify drive recovery.

Approach and aim at the service point, then press E when its prompt appears. Panels show the controls and readings for the current fault. Character conversations happen automatically and do not open equipment service.

Power, oxygen, and cooling failures can terminate a shift early. A stalled rover or offline uplink remains repairable, but both must be restored for handover. Repairs take active time; opening a panel does not pause the station.

3. Controls and comfort

InputAction
WASD / arrow keysMove
MouseLook
ShiftSprint
EOpen equipment service when prompted; follow the panel's controls afterward
BackspaceLeave an open repair panel
EscPause and release the mouse
PToggle photo pause
MToggle audio mute
RRestart the shift with a fresh seed; repeat the lesson while training

Start a shift to capture the mouse. Menu and photo pauses stop active shift time; the game also suspends active play when the tab is hidden or the window loses focus.

Settings include sensitivity, field of view, audio, reduced motion, and rendering quality. Automatic adapts rendering resolution to performance; Low uses fewer pixels and disables shadows. Desktop keyboard and mouse, WebGL, and mouse capture are required. Touch controls are not implemented.

4. Tech stack

LayerTechnologyRole in the project
3D rendererThree.js 0.180.0 / WebGLStation geometry, lighting, cameras, GLB loading, and raycasting
Game logicJavaScript ES modulesSystem state, incident scheduling, repair diagnostics, scoring, and input
InterfaceHTML and CSSHUD, equipment panels, dialogue, menus, and shift reports
Build toolingVite 8.3.2Local development server and static production bundles
Development runtimeNode.js and npmBuild scripts, release manifests, and verification
ModelsGLB / glTFSeventeen allowlisted station and character models
AudioWeb Audio API and bundled samplesArrival audio, warnings, and gameplay feedback
PersistenceBrowser localStorageVersioned personal bests, achievements, and recent results
DeploymentStatic hosting / Vercel configurationA browser-only release with no application server

There is no account system, backend, or external AI API. The station's dialogue comes from local authored lines.

5. Architecture

The application connects the Three.js station to separate modules for equipment rules, repair input, dialogue, training, and results. The following describes how those parts work together in V1.

Reproducible incidents and repairs

RunPlan.js selects a versioned incident plan. SeededRandom.js combines namespace hashing with a deterministic PRNG, separating timing and diagnostic streams. Plans are generated before play, so frame rate and repair attempts do not consume the schedule's randomness.

V1 includes 13 scheduled incidents and three repair variants for each of the five systems. RepairVariants.js generates the evidence and required actions.

To reopen a specific plan locally:

http://127.0.0.1:5173/?seed=LUNA-1234ABCD

The seed reproduces the planned incidents and readings. Your decisions still determine the outcome. See Seeded events.

Active time and system dependencies

ShiftSystem.js coordinates the five equipment models, failure deadlines, and handover. Updates split at scheduled events and deadline boundaries, keeping the rules consistent when frame lengths vary. Rendering, menu time, and active simulation time have separate responsibilities.

Faults also interact: blackout accelerates faulty cooling and prevents pump or uplink verification; oxygen priming increases backup power drain. Those rules make repair order consequential. See Difficulty and dependencies.

Interaction and presentation

InteractionManager.js checks range and real mesh visibility for targeting. StationInteractions.js connects nearby residents, dialogue, and discovery state. World-space speaker anchors, markers, and connectors identify who is talking; repair panels own input while they are open.

Equipment rules live in *System.js modules. Their *Gameplay.js counterparts connect those rules to input and presentation. TrainingSession.js reuses the actual equipment models in controlled lessons instead of duplicating the repair mechanics.

Results and local records

ScoreSystem.js calculates a terminal report from survival time, repairs, station integrity, discoveries, and outage penalties. PersonalBests.js stores versioned records locally and handles unavailable or corrupt browser storage. There is no global leaderboard. See Scoring.

Release integrity

The build creates a fresh release directory and copies only the models in AssetManifest.js. Its manifest records file sizes and SHA-256 checksums. Verification rejects missing, changed, extra, or unexpected files; the HTTP smoke check also checks served bytes and JavaScript/CSS MIME types.

6. Run locally

Use Git, Node.js 20.19+ on the 20.x line or 22.12+, matching package.json, and npm.

Bash (Linux, macOS, or Git Bash)

git clone https://github.com/tropicalbee/Moonbase-Intern.git
cd Moonbase-Intern
npm ci
npm run dev

Windows PowerShell

git clone https://github.com/tropicalbee/Moonbase-Intern.git
Set-Location Moonbase-Intern
npm.cmd ci
npm.cmd run dev

Open http://127.0.0.1:5173. Stop the server with Ctrl+C. The PowerShell commands use npm.cmd to avoid script-policy issues.

If you downloaded a ZIP instead, extract it, open a terminal in the folder containing package.json, and start with npm ci (npm.cmd ci in PowerShell).

7. Build and preview

Bash

npm run build
npm run verify:release
npm run test:release
npm run preview

Windows PowerShell

npm.cmd run build
npm.cmd run verify:release
npm.cmd run test:release
npm.cmd run preview

Open http://127.0.0.1:4173 to preview the release. These commands do not launch a browser.

CommandResult
npm run buildCreates and verifies a fresh dist/releases/public-* folder.
npm run verify:releaseRechecks the latest release's manifest, checksums, and asset references.
npm run test:releaseServes that release on localhost, fetches every packaged file, checks hashes and MIME types, then stops.
npm run previewServes the latest verified release on port 4173.

dist/latest-release.txt identifies the current release. For a static host, upload the contents of that release folder, rather than the entire repository. The included Vercel configuration copies the verified release into vercel-dist/. See Public build.

8. Project status

V1. The game is playable, with all five systems, training, seeded repair variants, dialogue, secrets, and shift reports implemented. Navigation, difficulty, performance, and browser compatibility still benefit from playtesting. Older implementation notes may describe earlier phases; the source defines current behavior.

Built by @tropicalbee as a fun side project while spending time experimenting with GPT models. A little curiosity, a lot of tinkering, and somehow a whole lunar station to look after. Focused fixes, experiments, and feedback are welcome.

9. Open source and contributing

Found a bug? Open an issue with the seed, affected equipment, browser, operating system, and reproduction steps. A screenshot or short recording helps, especially for interaction and rendering problems.

Want to help? Performance work, accessibility, clearer repair feedback, testing on different hardware, and recovering asset attribution are all useful contributions.

If the project is useful or you enjoyed your shift, star the repository to support it. Fork it to experiment or contribute your own improvements.

10. Credits and license

Original project code is licensed under Apache 2.0. Models, audio, and third-party libraries retain their respective licenses. Some original asset sources and permissions still need verification; consult Third-Party Notices before redistributing assets.

The banner uses the game's existing station cover, with SVG typography and shading. Model creator clues include Poly by Google, Quaternius, Zsky, and Dipper98; the attribution record preserves what is currently known without assigning unverified licenses.


Made by @tropicalbee, somewhere between curiosity and another repair attempt.

bro really accepted an unpaid internship on the Moon and still got a performance review.
if the cactus starts giving career advice, just hear him out .

tropicalbee/Moonbase-Intern

A cinematic 3D browser game where you're a lunar station intern juggling system failures, emergency repairs, and escalating chaos. Try not to break anything.

JavaScript

0

3 commits

updated Oct 16, 2026

See the code

See what people are saying

SourceMessageScoreDate

built Moonbase Intern : a browser game where you have 7 minutes to stop a moonbase from falling apart..needs feedback to improve it !! (r/SideProject)

hey folks !!! so made a little 3d browser game using three.js where you spend 7 minutes trying to keep a moonbase running. power cuts, oxygen leaks, overheating equipment, a rover that refuses to cooperate... and somehow it's all your problem. built this in my free time as time pass.... it's only…

1

Oct 17, 2026

I made a 3D browser game where you're an intern on the Moon. Try not to destroy the station 💀 (r/coolgithubprojects)

7 minutes. One intern. A whole moonbase to manage. What could possibly go wrong? 😅 Meet Moonbase Intern, a small 3D game built with Three.js (and a lot of help from my AI coding agent). Power failures, oxygen emergencies, overheating labs, a troublesome rover, and a station AI that judges your…

0

Oct 16, 2026

README

Moonbase Intern: Please Don't Break Anything. The glass dome of Habitat 07 beneath the lunar sky.

Moonbase Intern

Seven minutes. Five systems. One very underqualified intern.

A first-person browser game about keeping a lunar research station alive until handover.

Three.js 0.180.0 Vite 8.3.2 JavaScript ES modules Code license: Apache 2.0 Status: V1

Play in your browser · Run locally · Architecture · Report a bug · Contribute

Created by @tropicalbee

1. Welcome to Habitat 07

You arrive at a glass-domed research station on the Moon. There are plants under the lights, a rover collecting samples, and equipment that seems unusually willing to introduce itself. Your assignment sounds straightforward: keep the station operational for one shift.

Then the warnings start.

Power, oxygen, lab cooling, communications, and Scout's drive can all develop faults. You have to reach the equipment, read its diagnostic panel, and carry out the repair while the shift clock keeps moving. Later incidents overlap, so deciding what to fix first matters as much as knowing which button to press.

Between alarms, meet Spike the security cactus, Sunny the desert marigold, Moss the tortoise, and the rest of the station. Their dialogue is authored, their opinions are plentiful, and some encounters lead beyond your maintenance checklist.

What you can do

  • Work a seven-minute shift. Progress through orientation, pressure, chaos, and a final-minute inspection.
  • Diagnose five systems. Fifteen repair procedures change the work itself, from isolating a leaking bank to correcting a rover's encoder drift.
  • Practice before the real shift. Training uses the same repair panels with protected reserves, hints, and repeatable fault variants, without writing a score.
  • Meet the residents. Looking toward a nearby resident triggers automatic dialogue; remarks also respond to station conditions.
  • Explore between incidents. Find three optional secrets without losing track of life support.
  • Compare another attempt. Review your grade, station condition, discoveries, and local personal best; replay the same seed or start fresh.

2. Your maintenance route

SystemService pointDiagnostic work
PowerWatt, the power cellIsolate tripped feeds, leaking banks, or bus back-feeds; reconnect a suitable supply.
OxygenCapsule, the research podBalance flows, bypass a blocked filter, or purge trapped pressure before priming.
CoolingPatch, the console inside the labRelieve pressure, reopen a blocked return, or calibrate a probe; synchronize the pump.
CommunicationsRelay's ground uplink at WattTune frequency and phase; some faults also require relay routing or polarity correction.
RoverScoutDiagnose motor current, brake drag, or encoder error; verify drive recovery.

Approach and aim at the service point, then press E when its prompt appears. Panels show the controls and readings for the current fault. Character conversations happen automatically and do not open equipment service.

Power, oxygen, and cooling failures can terminate a shift early. A stalled rover or offline uplink remains repairable, but both must be restored for handover. Repairs take active time; opening a panel does not pause the station.

3. Controls and comfort

InputAction
WASD / arrow keysMove
MouseLook
ShiftSprint
EOpen equipment service when prompted; follow the panel's controls afterward
BackspaceLeave an open repair panel
EscPause and release the mouse
PToggle photo pause
MToggle audio mute
RRestart the shift with a fresh seed; repeat the lesson while training

Start a shift to capture the mouse. Menu and photo pauses stop active shift time; the game also suspends active play when the tab is hidden or the window loses focus.

Settings include sensitivity, field of view, audio, reduced motion, and rendering quality. Automatic adapts rendering resolution to performance; Low uses fewer pixels and disables shadows. Desktop keyboard and mouse, WebGL, and mouse capture are required. Touch controls are not implemented.

4. Tech stack

LayerTechnologyRole in the project
3D rendererThree.js 0.180.0 / WebGLStation geometry, lighting, cameras, GLB loading, and raycasting
Game logicJavaScript ES modulesSystem state, incident scheduling, repair diagnostics, scoring, and input
InterfaceHTML and CSSHUD, equipment panels, dialogue, menus, and shift reports
Build toolingVite 8.3.2Local development server and static production bundles
Development runtimeNode.js and npmBuild scripts, release manifests, and verification
ModelsGLB / glTFSeventeen allowlisted station and character models
AudioWeb Audio API and bundled samplesArrival audio, warnings, and gameplay feedback
PersistenceBrowser localStorageVersioned personal bests, achievements, and recent results
DeploymentStatic hosting / Vercel configurationA browser-only release with no application server

There is no account system, backend, or external AI API. The station's dialogue comes from local authored lines.

5. Architecture

The application connects the Three.js station to separate modules for equipment rules, repair input, dialogue, training, and results. The following describes how those parts work together in V1.

Reproducible incidents and repairs

RunPlan.js selects a versioned incident plan. SeededRandom.js combines namespace hashing with a deterministic PRNG, separating timing and diagnostic streams. Plans are generated before play, so frame rate and repair attempts do not consume the schedule's randomness.

V1 includes 13 scheduled incidents and three repair variants for each of the five systems. RepairVariants.js generates the evidence and required actions.

To reopen a specific plan locally:

http://127.0.0.1:5173/?seed=LUNA-1234ABCD

The seed reproduces the planned incidents and readings. Your decisions still determine the outcome. See Seeded events.

Active time and system dependencies

ShiftSystem.js coordinates the five equipment models, failure deadlines, and handover. Updates split at scheduled events and deadline boundaries, keeping the rules consistent when frame lengths vary. Rendering, menu time, and active simulation time have separate responsibilities.

Faults also interact: blackout accelerates faulty cooling and prevents pump or uplink verification; oxygen priming increases backup power drain. Those rules make repair order consequential. See Difficulty and dependencies.

Interaction and presentation

InteractionManager.js checks range and real mesh visibility for targeting. StationInteractions.js connects nearby residents, dialogue, and discovery state. World-space speaker anchors, markers, and connectors identify who is talking; repair panels own input while they are open.

Equipment rules live in *System.js modules. Their *Gameplay.js counterparts connect those rules to input and presentation. TrainingSession.js reuses the actual equipment models in controlled lessons instead of duplicating the repair mechanics.

Results and local records

ScoreSystem.js calculates a terminal report from survival time, repairs, station integrity, discoveries, and outage penalties. PersonalBests.js stores versioned records locally and handles unavailable or corrupt browser storage. There is no global leaderboard. See Scoring.

Release integrity

The build creates a fresh release directory and copies only the models in AssetManifest.js. Its manifest records file sizes and SHA-256 checksums. Verification rejects missing, changed, extra, or unexpected files; the HTTP smoke check also checks served bytes and JavaScript/CSS MIME types.

6. Run locally

Use Git, Node.js 20.19+ on the 20.x line or 22.12+, matching package.json, and npm.

Bash (Linux, macOS, or Git Bash)

git clone https://github.com/tropicalbee/Moonbase-Intern.git
cd Moonbase-Intern
npm ci
npm run dev

Windows PowerShell

git clone https://github.com/tropicalbee/Moonbase-Intern.git
Set-Location Moonbase-Intern
npm.cmd ci
npm.cmd run dev

Open http://127.0.0.1:5173. Stop the server with Ctrl+C. The PowerShell commands use npm.cmd to avoid script-policy issues.

If you downloaded a ZIP instead, extract it, open a terminal in the folder containing package.json, and start with npm ci (npm.cmd ci in PowerShell).

7. Build and preview

Bash

npm run build
npm run verify:release
npm run test:release
npm run preview

Windows PowerShell

npm.cmd run build
npm.cmd run verify:release
npm.cmd run test:release
npm.cmd run preview

Open http://127.0.0.1:4173 to preview the release. These commands do not launch a browser.

CommandResult
npm run buildCreates and verifies a fresh dist/releases/public-* folder.
npm run verify:releaseRechecks the latest release's manifest, checksums, and asset references.
npm run test:releaseServes that release on localhost, fetches every packaged file, checks hashes and MIME types, then stops.
npm run previewServes the latest verified release on port 4173.

dist/latest-release.txt identifies the current release. For a static host, upload the contents of that release folder, rather than the entire repository. The included Vercel configuration copies the verified release into vercel-dist/. See Public build.

8. Project status

V1. The game is playable, with all five systems, training, seeded repair variants, dialogue, secrets, and shift reports implemented. Navigation, difficulty, performance, and browser compatibility still benefit from playtesting. Older implementation notes may describe earlier phases; the source defines current behavior.

Built by @tropicalbee as a fun side project while spending time experimenting with GPT models. A little curiosity, a lot of tinkering, and somehow a whole lunar station to look after. Focused fixes, experiments, and feedback are welcome.

9. Open source and contributing

Found a bug? Open an issue with the seed, affected equipment, browser, operating system, and reproduction steps. A screenshot or short recording helps, especially for interaction and rendering problems.

Want to help? Performance work, accessibility, clearer repair feedback, testing on different hardware, and recovering asset attribution are all useful contributions.

If the project is useful or you enjoyed your shift, star the repository to support it. Fork it to experiment or contribute your own improvements.

10. Credits and license

Original project code is licensed under Apache 2.0. Models, audio, and third-party libraries retain their respective licenses. Some original asset sources and permissions still need verification; consult Third-Party Notices before redistributing assets.

The banner uses the game's existing station cover, with SVG typography and shading. Model creator clues include Poly by Google, Quaternius, Zsky, and Dipper98; the attribution record preserves what is currently known without assigning unverified licenses.


Made by @tropicalbee, somewhere between curiosity and another repair attempt.

bro really accepted an unpaid internship on the Moon and still got a performance review.
if the cactus starts giving career advice, just hear him out .