Prehistoric Animal Museum: a bilingual 3D museum for ages 2 to 6
A free, open-source bilingual 3D museum where young children and their grown-ups explore prehistoric animals across land, sea, and sky.
At a glance
- What is it?
- s010s/prehistoric-animal-museum is an AGPL-3.0 TypeScript and Three.js web museum with no accounts, no ads and no analytics. It is built for a child and an adult sitting at the same screen, and its content pipeline is where the real work lives.
- Who is it for?
- Adopt it if you want a calm, ad-free bilingual exhibit space for a 2 to 6 year old and are willing to keep a Node.js 20.19 toolchain around, or if you want to contribute animals through ANIMAL_AUTHORING_GUIDE.md. Do not adopt it as a general paleontology reference, as a K-12 teaching platform, or if you intend to reuse the narration, exhibit backgrounds or branding commercially without reading LICENSING.md, BRAND_POLICY.md and THIRD_PARTY_NOTICES.md first.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 4 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 16, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What the museum is, and who it is actually for
The README opens with a personal reason rather than a feature list. The author writes that when his daughter was three, dinosaurs on television made her uneasy, because the stories centred on chases, fights and "defeating the dinosaur". The museum is the answer to that: a place with no winning or losing and, in the README's words, no frightening scene waiting around the corner. A child picks an animal, turns it, and hears a short introduction. That framing decides almost every other design choice in the repository.
The stated audience is children aged 2 to 6 with a grown-up nearby, though the README adds that curiosity matters more than the age label. The collection is grouped into land, sky and sea. Land includes Stegosaurus, Triceratops, Tyrannosaurus rex, Apatosaurus, Spinosaurus and the Woolly mammoth; sky includes Pteranodon, Rhamphorhynchus, Meganeura and Archaeopteryx; sea includes Mosasaurus, Megalodon, Ichthyosaurs, Plesiosaurs and Anomalocaris. Two of those entries are deliberately not species: the README states that the ichthyosaur and plesiosaur exhibits represent broader groups of related animals. It also warns that colours, soft tissue and some movement are evidence-informed artistic reconstructions, since fossils do not preserve every answer. That honesty about reconstruction is unusual in a children's product and worth crediting.
It is not a curriculum. There are no quizzes, no progress tracking, no stars to collect. The README says the museum "is not designed to keep children on the screen" and that discovering one interesting detail is enough. If your requirement is measurable learning outcomes, this project does not attempt to provide them.
How the exhibits, narration and parent guide fit together
This is a static site with a Three.js scene layer on top. The repository layout shows src/content/animals/ holding per-animal folders with images such as thumbnail.webp, so each exhibit is a content directory rather than a row in a database. The README describes models, images and narration as "prepared static assets" and states that the museum experience makes no runtime calls to AI, advertising or analytics services. The consequence is a build that validates and packages content instead of a server that serves it.
That shows up in package.json. The build script chains validate:content, validate:model-previews, a TypeScript project build, scripts/build-static-site.ts, and finally validate:production-boundary. There is a separate build:e2e target that runs the same content validation and static build with an --mode e2e flag, and a postbuild:e2e step that runs scripts/sync-local-preview-4190.mjs. Content validation is treated as a gate, not a suggestion: an animal with a malformed entry can stop the build rather than appear broken in front of a child.
Bilingual behaviour is a first-class concern. The museum follows the device language on a first visit, the choice is remembered, and each language has a shareable link. Narration exists in English and Mandarin, is short, and never auto-plays. The parent guide is the second half of the experience: it covers when an animal lived, fossil discovery regions, size, diet, classification and source references. In practice the adult reads that panel while the child drags the model.
Privacy is handled with the same explicitness. The application has no sign-in or user profile. In a feature called "Compare with me", a parent may optionally choose boy or girl and enter an approximate height, but the README states those inputs only set the current page's 3D character scale and viewpoint, are not placed in the URL, are not uploaded, are not sent to analytics, and disappear when the page closes. That is a narrow data flow and it is documented as such.
Install it locally and open the first exhibit
The README requires Node.js 20.19 or newer, and package.json repeats the constraint under engines as node >=20.19.0. Clone the repository, then install from the lockfile rather than resolving fresh versions. npm ci is the command the README gives, and it is the right one here because package-lock.json is committed.
npm ci
npm run devThe second command starts Vite in development mode. The README does not state the port, so read the URL that Vite prints in the terminal and open it. You should land on the museum entry screen, with the language following your browser locale. Turning a model is a drag with mouse or finger, and zoom is a scroll or a pinch. Narration only starts when you press play.
Before opening a pull request, the README lists the project checks. Run them in this order and expect the content validators to be the slow part:
npm run lint
npm run typecheck
npm test -- --run
npm run build
npm run test:e2eTwo environment details are worth knowing before you hit problems. The repository ships an .env.example with a single key, MUSEUM_ALLOWED_HOSTS, described as a comma-separated list of hostnames that may access the local Vite server. If you open the dev server through a hostname other than localhost, that variable is where you add it. The .nvmrc file pins the Node line, so nvm use is the simplest way to match what the project expects.
If you want to add an animal rather than just run one, the README points at ANIMAL_AUTHORING_GUIDE.md as the starting document, and CONTRIBUTING.md for code, content and asset changes. Read both before opening a pull request; the guide exists precisely because an exhibit is a folder of assets plus metadata, not a single file edit.
Where the project is thin, and when it is the wrong tool
The README does not document any rollback or versioning path for content. There is no mention of how a published exhibit is corrected or withdrawn, no changelog, and no release history in the repository. For a static museum that is survivable, but it means a mistake in narration or a mislabelled reconstruction is fixed by another commit and another deploy, with no documented review state in between.
Three more limits follow from the design. First, the collection is small and fixed: the README lists roughly twenty-four exhibits, two of which are group-level rather than species-level. Anyone wanting broad taxonomic coverage will run out of animals quickly. Second, there is no assessment layer at all, so it cannot serve a classroom that needs to demonstrate progress. Third, the experience depends on 3D assets and narration, which means the repository is heavy to clone and the build runs model preview generation and validation steps that a plain content site would not need.
There is also a licensing boundary that rules out some uses before any technical question arises. The code is AGPL-3.0-only, but the original museum writing, narration and exhibit backgrounds are CC BY-NC-SA 4.0, and the README states that third-party libraries, fonts, 3D models and mixed assets retain their own recorded terms. A commercial deployment that reuses the narration or backgrounds is therefore not covered by the code licence alone. If you need a freely relicensable asset set, this is the wrong source.
Finally, the project is not a substitute for a natural history museum's collection data. It is a viewing experience with a parent guide, and the README is explicit that some reconstructions are artistic.
How it differs from a general-purpose 3D web viewer
The obvious alternative is to take a general WebGL or Three.js viewer, load glTF models into it, and write your own captions. That approach gives you unlimited content and no content pipeline to satisfy. The difference is everything the museum wraps around the viewer: content validation that runs before the build, a parent guide schema covering time period, fossil regions, size, diet and classification, bilingual narration with shareable per-language links, and reduced-motion and keyboard support. You would rebuild those yourself, and the validation is the part most people skip until a broken exhibit ships.
A second alternative is a hosted museum or educational platform, where the trade-off is control rather than features. The museum's own position is the opposite: it is free to visit, has no account, no ads and no analytics scripts, and the README states there is no membership, knowledge unlock or paywall. If your institution needs per-class rosters, progress reporting or SSO, a hosted platform is the better fit and this project will not meet that requirement.
A third option is to fork the museum and re-skin it for another subject entirely: a local geology collection, a botanical garden, a set of historical artefacts. The README explicitly welcomes renamed and rebranded forks within the applicable licences, while reserving the project names, logos and source-identifying brand elements. The mechanism you inherit is the animal folder plus validators; whether the parent guide schema fits your subject is the question to answer before you start, because it is oriented around paleontology fields.
Maintenance, build cost and what the licences mean in practice
The last push to the default branch was on 2026-09-16, and the repository is not archived. The declared version is 0.1.0 and the repository carries no releases, so treat the API surface as pre-1.0: file layout, scripts and content schema can change between commits without a deprecation cycle.
Upgrade cost is concentrated in the toolchain. Node.js 20.19 or newer is a hard floor, and the build runs several TypeScript and tsx scripts in sequence, so a Node or TypeScript major bump touches the whole chain at once. The repository also carries multiple Playwright configurations (playwright.config.ts, playwright.review.config.ts, playwright.readme-screenshots.config.ts, playwright.scale-encounter-gpu.config.ts), which means end-to-end and screenshot verification is part of normal maintenance rather than an optional extra. Budget for that, and for the model preview generation step, which is a rendering job rather than a file copy.
On licensing, three layers apply and they do not move together. The software code is AGPL-3.0-only, which for a network-deployed fork carries a source-availability obligation; the README directs readers to LICENSING.md for boundaries. Original writing, narration and exhibit backgrounds are CC BY-NC-SA 4.0, whose non-commercial term is the one most likely to matter to a school or business. Third-party libraries, fonts and 3D models keep their own terms, recorded in THIRD_PARTY_NOTICES.md with attributions, sources and modifications. The brand policy reserves the project names and logos while permitting renamed forks. This is a description of what the repository states, not legal advice; if a deployment has commercial intent, have someone read LICENSING.md, BRAND_POLICY.md and THIRD_PARTY_NOTICES.md together before you build on it.
Editorial conclusion
Adopt it if you want a calm, ad-free bilingual exhibit space for a 2 to 6 year old and are willing to keep a Node.js 20.19 toolchain around, or if you want to contribute animals through ANIMAL_AUTHORING_GUIDE.md. Do not adopt it as a general paleontology reference, as a K-12 teaching platform, or if you intend to reuse the narration, exhibit backgrounds or branding commercially without reading LICENSING.md, BRAND_POLICY.md and THIRD_PARTY_NOTICES.md first. Before committing, verify three things yourself: that npm run build passes on your machine, that the third-party model and font terms recorded in THIRD_PARTY_NOTICES.md fit your intended use, and that a renamed fork can satisfy the AGPL-3.0-only source-availability obligation for whatever you deploy.
Frequently asked questions
What is a prehistoric animal, in the context of this museum?
The museum groups its exhibits into land, sky and sea, covering animals such as Stegosaurus, Pteranodon and Mosasaurus. Two exhibits, Ichthyosaurs and Plesiosaurs, represent broader groups of related animals rather than one exact species.
Is there a real T-rex skeleton in the Prehistoric Animal Museum?
No. The museum presents 3D models and static assets, and the README states that colours, soft tissue and some movement are evidence-informed artistic reconstructions rather than exact portraits.
Does Prehistoric Animal Museum need an account or collect data about my child?
There is no sign-in or user profile, and the README states the site has no advertising or analytics scripts. The optional boy or girl and height inputs in "Compare with me" only set the current page's 3D character scale and viewpoint and disappear when the page closes.
How do I run Prehistoric Animal Museum locally?
Install Node.js 20.19 or newer, then run npm ci followed by npm run dev, as the README's local development section shows. The README does not state which port the dev server uses.
Can I add a new animal to Prehistoric Animal Museum?
Yes. The README says to start with the animal authoring guide, ANIMAL_AUTHORING_GUIDE.md, and to read CONTRIBUTING.md before opening a pull request for code, content or asset changes.
What licence does Prehistoric Animal Museum use?
The software code uses AGPL-3.0-only, while original museum writing, narration and exhibit backgrounds use CC BY-NC-SA 4.0. Third-party libraries, fonts and 3D models keep their own recorded terms, listed in THIRD_PARTY_NOTICES.md.
Community notes