# Prehistoric Animal Museum: the readme asks for Node 20.19, the manifest demands 22.13, and the build validates itself twice

> A bilingual three-dimensional museum for small children, with no accounts, no ads and no analytics, licensed under four separate layers plus a brand reservation. Its production build asserts that a gated feature is present in the output, its disabled build asserts the opposite, and the only documented environment variable is a host allowlist for the local dev server.

**s010s/prehistoric-animal-museum** — A free, open-source bilingual 3D museum where young children and their grown-ups explore prehistoric animals across land, sea, and sky.

- Repository: https://github.com/s010s/prehistoric-animal-museum
- Website: https://leon-made-this.work/museum/en/
- Stars: 1,081 · Forks: 136
- Language: TypeScript
- License: AGPL-3.0
- Published: 2026-09-16 · Updated: 2026-09-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/s010s-prehistoric-animal-museum

## The readme asks for Node 20.19 and the manifest asks for 22.13

The local development section states one requirement in plain language: Node.js 20.19 or newer. The package manifest states a different one in the engine field: 22.13.0 or newer. A version file sits at the root as well. So there are three places a contributor could learn the floor and two possible answers, and the more prominent one, the sentence in the readme, is the lower and older of the two. Nothing in the readme mentions the manifest constraint, and the install instruction is just two commands:

```sh
npm ci
npm run dev
```

For a project whose whole point is that a parent and a two-year-old will use it without thinking, a contributor friction point at the first command is a small blemish, and it is the kind that gets fixed by whoever hits it rather than by a written policy. The readme also spells out the five project checks in a collapsed block, and one of them has to be given an extra flag: the test script starts the unit runner in watch mode unless you pass a flag to make it run once and exit.

## The production build asserts the feature is present, and the other build asserts it is not

The build is not a bundler call. The main build script runs a validation step, then sets two environment flags and delegates to a site build, then validates the finished output directory with the flag turned on. The site build itself runs a content validation, a model preview validation, the TypeScript project build, a static site generator script, and a production boundary validation. There is a matching script that runs the same site build and then validates the output with the flag turned off. So the two builds assert opposite things about the same gated feature and both check the emitted files rather than the source. The two environment variables are named for the feature, one enabling it and one marking it public. Nothing in the readme explains what the feature is, only that a build will fail if the output disagrees with the flag.

## Twenty-four exhibits, two of which are groups rather than animals

The collection is grouped by where the animal lived: fourteen on land, five in the sky and five at sea, with three animals featured in the header. The page is candid about two of them. The ichthyosaur and plesiosaur exhibits represent broader groups of related animals rather than one exact species, so two of the twenty-four slots are group labels and the other twenty-two are named species. The same paragraph sets the epistemic limit for the whole museum: fossils do not preserve everything, so colour, soft tissue and some movement are reconstructions informed by evidence rather than exact portraits. That sentence is doing real work, because a three-dimensional animal that a child can turn around invites the assumption that what they see is what the fossil says.

## Four licence layers and a brand reservation

The licensing section is unusually precise and the layers do not agree with each other, by design. The software is under a reciprocal licence, only, with no or-later variant. The original writing, narration and exhibit backgrounds are under a Creative Commons licence that permits sharing and adaptation but not commercial use. Third-party libraries, fonts and three-dimensional models keep whatever terms they came with, recorded in a separate notices file. And the fourth layer is not a licence at all: the project names, the logos and the source-identifying brand elements are reserved to prevent confusion about which copy is official, with renamed and rebranded forks explicitly still welcome. So the code is shareable under its terms, the writing is not commercially reusable, and anyone hosting their own version has to decide deliberately whether to keep the name.

## No analytics, and a worker that fetches a star count

The privacy section makes four claims in specific terms: no sign-in and no profile, no names or contact details asked for, no advertising or analytics scripts or membership or paywall, and no runtime calls to AI, advertising or analytics services, with models, images and narration prepared as static assets. One feature collects something and explains it precisely: a compare-with-me view where a parent may optionally choose a sex and enter an approximate height, used only to set the character scale and viewpoint on that page, kept out of the address, never uploaded, never sent to analytics, and gone when the page closes. Separately, the repository contains a worker and a test file named for a GitHub stars badge, which means something in the deployed site fetches a star count at runtime. That is not analytics, but it is a network call the calm private visit section does not mention.

## The scale comparison is the one feature with a dedicated graphics test

Putting a child's height next to an animal is the feature most likely to be wrong in a way a unit test cannot see, because it depends on rendering. The repository treats it that way. There is a repair script for the animation data of the models used in the scale encounter, a script that optimises the runtime models, a preview renderer with separate targets for production and for review, and four separate Playwright configurations rather than one: a general one, one for the readme screenshots, one for review, and one named for the scale encounter on graphics hardware. The readme images themselves are generated. For a project that tells you not to worry about metrics and to let a child look at one thing, the testing effort has gone almost entirely into making the pictures correct.

## The only environment variable documented is a dev server allowlist

The example environment file contains a single setting: a comma-separated list of hostnames permitted to reach the local development server. That is a defensive setting rather than a feature, and its presence says something about how the team treats the one command in the readme that a stranger might paste from a fork. Everything else the build needs, including the two flags that decide whether the gated feature is on in production, is set inside the build scripts rather than in an environment file. So a deployer has one knob, and it protects the developer's machine rather than the deployer's.

## GitHub is the source, a regional host is the official mirror

The footer names two repositories and assigns them roles. The one on GitHub is described as the primary repository for development, for issues and for pull requests. The second, on a regional git hosting service, is described as the official mirror for visitors in Mainland China. That is a sensible accommodation for reach, and it introduces the usual question of which copy is authoritative when they diverge, which the page does not address beyond saying what each is for. The live site is on a personal subdomain with a language segment in the path, and the page notes that the museum follows the device language on a first visit, that the choice can be changed at any time, and that each language has its own shareable link.

## Conclusion

Use Prehistoric Animal Museum as a self-hosted exhibit for a small child with an adult beside them, and expect to host the built static site yourself rather than add it to your site. Five things to check first. Sort out the runtime version, because the readme and the manifest name different floors and a contributor who trusts the readme will hit the engine check. Read the brand policy before you fork, because the project names and logos are reserved to prevent confusion about the official source, and while renamed forks are welcome that decision has to be made deliberately. Note that the narration, exhibit text and backgrounds are under a non-commercial licence while the code is under a reciprocal one, so a school or a paid app cannot reuse the writing without a separate permission. Read the authoring guide before adding an animal, since the collection is validated at build time. And treat the two species entries as an honest limitation rather than a bug: two of the exhibits stand for whole groups rather than one animal.

## FAQ

### What Node version does Prehistoric Animal Museum need?

Two different answers. The readme says Node.js 20.19 or newer, while the package manifest's engine field requires 22.13.0 or newer, and a version file sits at the repository root.

### What licences apply to Prehistoric Animal Museum?

The code is under a reciprocal licence with the only variant, the writing, narration and exhibit backgrounds are under a Creative Commons licence that forbids commercial use, third-party assets keep their own terms, and the project names and logos are reserved to distinguish the official source.

### Does Prehistoric Animal Museum collect any personal data?

There is no sign-in and no profile. The optional compare-with-me view takes a sex and an approximate height to set the on-page character scale, keeps them out of the address, uploads nothing, sends nothing to analytics, and forgets them when the page closes.

### How many prehistoric animals does the museum include?

Twenty-four exhibits across land, sky and sea. The ichthyosaur and plesiosaur exhibits stand for broader groups of related animals rather than one species, and colours, soft tissue and some movement are reconstructions rather than exact portraits.

### What are the project checks for Prehistoric Animal Museum?

A lint command with zero warnings allowed, a type check, the unit test runner in one-shot mode, a production build, and an end-to-end run. There are also separate Playwright configurations for review, for generating the readme screenshots and for the scale comparison on graphics hardware.

## Sources

- [Issues](https://github.com/s010s/prehistoric-animal-museum/issues)
- [License: AGPL-3.0](https://github.com/s010s/prehistoric-animal-museum/blob/main/LICENSE)
- [Project website](https://leon-made-this.work/museum/en/)
- [README](https://github.com/s010s/prehistoric-animal-museum/blob/main/README.md)
- [s010s/prehistoric-animal-museum on GitHub](https://github.com/s010s/prehistoric-animal-museum)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/s010s-prehistoric-animal-museum
