Library / SDK
taibeled/JetLagHideAndSeek avatar
taibeled/JetLagHideAndSeek

JetLagHideAndSeek: a map generator for Jet Lag The Game's Hide and Seek

Automatic map generation for Jet Lag The Game's Hide and Seek.

532 stars113 forksTypeScriptMIT

At a glance

What is it?
JetLagHideAndSeek is an Astro and React web tool that computes answers to Jet Lag The Game's Hide and Seek round questions and draws them on an interactive map, so you can see which locations satisfy a constraint set. It is a static site with no server, and it is driven by geospatial data in the browser.
Who is it for?
Adopt JetLagHideAndSeek if you play Jet Lag The Game's Hide and Seek and want to see where the valid hiding places actually are rather than guessing one at a time, since the map computes and plots each round's answer set. Do not adopt it for other Jet Lag modes, because the project covers the Hide and Seek variant only.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 56 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 October 20, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What the tool computes and why a map helps

The repository description is a single line: automatic map generation for Jet Lag The Game's Hide and Seek. The README expands it as a tool to trivially generate interactive maps for viewing hiding possibilities in Jet Lag The Game's Hide and Seek.

That word trivially is doing some work, because the underlying question is not trivial at all. Hide and Seek rounds ask you to find a location satisfying a set of constraints, such as a place in the same prefecture as the previous answer, or within a certain radius of the last point, or near a particular kind of landmark. Each round adds another constraint, and the set of valid locations shrinks. Working that out by reasoning is slow, and working it out by clicking around a map one candidate at a time is slower.

So the tool inverts the problem. Rather than testing candidates, it computes the set of locations that satisfy the chosen constraints and draws them on a map, so you can see the shape of the answer region directly. The README also says that so far the listed questions have been implemented, with a link to an issue for more, which is an honest statement about the coverage.

The questions fall into four families, and the taxonomy is the clearest way to understand what the tool can do.

Radius is the simplest, with a single option, All. Thermometer is likewise a single option, All.

Matching is the large family, and each option is a way of saying a candidate matches the previous answer. Same occupance of a custom zone, same nearest of custom points, same zone, meaning the same region or prefecture, same first letter of zone, same nearest commercial airport, same train line, same nearest major city, same length of the station's name, same first letter of the train station name, and then a run of nearest-landmark matches: park, amusement park, zoo, aquarium, golf course, mountain, museum, movie theater, hospital, library, and foreign consulate.

Measuring is the second large family, and it is the one that produces a distance rather than a match: distance to custom points, a line or a polygon, distance to the coastline, to a commercial airport, to a major city, to high-speed rail, to a rail station, to a 7-Eleven, to a McDonald's, and the same landmark list again.

Tentacles is the third family and the most game-specific. It lists custom locations, zoo, aquarium, amusement park, museum, hospital, movie theater and library, which is to say the locations that count as hiding places in a tentacle round.

So the tool covers roughly fifty question types across four categories, which is a lot of ground for one utility.

The stack: Astro, React, Leaflet and ArcGIS

The package.json shows the technology choices, and they line up with what the tool needs to do rather than with a house style.

The framework is Astro at 5.7, with the React integration, the Tailwind integration and the Partytown integration. The React integration is there because the map interface is stateful and interactive, and the Partytown integration moves third-party scripts off the main thread so a heavy mapping widget does not block the page.

The mapping itself is Leaflet at 1.9, with leaflet-draw for drawing custom shapes, leaflet-contextmenu for the right-click menu, and leaflet-easyprint for printing. The ArcGIS packages, @arcgis/core and @terraformer/arcgis, sit alongside Leaflet rather than replacing it, which is the usual arrangement when a project needs ArcGIS basemaps or geocoding while keeping Leaflet for the vector layers and the drawing tools.

The geometry work is done with Turf at 7.2 and d3-geo, d3-geo-projection and d3-geo-voronoi. The Voronoi package is the interesting one: dividing the map into cells nearest to each candidate location is exactly what you need for the nearest-landmark matching questions, where the answer depends on which landmark is closest rather than on a region boundary.

osmtogeojson converts OpenStreetMap data into GeoJSON, which is how the coastline and the point data get into the browser in a form Leaflet can draw. open-location-code handles the plus codes that the game uses to specify locations, and papaparse parses the CSV data files the tool ships with, and lodash and clsx and class-variance-authority are the usual utility trio.

The UI primitives are Radix UI components for dialog, popover, select, tooltip, checkbox, toggle and separator, with cmdk for the command palette and lucide-react for icons. Nanostores, with @nanostores/react and @nanostores/persistent, handle the state, and the persistent variant is what lets your preferences survive a reload.

The build is Vite-based through Astro, with vite-plugin-pwa for a progressive web app, which is the right call for a tool you want to open on a phone while playing.

The primary language is TypeScript, the licence is MIT, the default branch is master, and the last push was on 2026-08-28. The package version is still 0.0.1 and there are no GitHub releases, which fits a project with a large codebase and no published artifact, since it is deployed as a site rather than consumed as a package.

Running it locally as a static site

The developer workflow section is short and assumes a static site, which is the right architecture for this kind of tool.

You need git, Node.js at version 24 or earlier, and pnpm. Then you clone and enter the directory.

bash
git clone https://github.com/taibeled/JetLagHideAndSeek.git
cd JetLagHideAndSeek

Install the dependencies with pnpm.

bash
pnpm install

And host the site as you modify it.

bash
pnpm dev

The README's instruction after that is to run pnpm lint after any modification, to have your code automatically formatted and errors spotted. The lint script confirms what that means: it runs eslint with --fix over src and then prettier over the whole tree with --write. So formatting is not optional and lint failures are fixed in place rather than reported.

The other scripts are the standard Astro set, astro dev, astro build and astro preview, plus vitest as the test runner. The presence of vitest.config.ts and a tests/ directory in the tree means the test setup exists, but the contributing checklist still lists Tests as an open item with its own issue, so the suite is not yet the safety net it is configured to be.

The Node version constraint is worth flagging because it is an upper bound rather than a lower one. Node 24 or earlier, not 24 or later. That is unusual, and it usually means a dependency has not yet caught up with the newest release, so pinning to an older Node is the workaround rather than a preference.

The whole thing builds to static files, which is the right shape for the problem. There is no server component, no API to host and no database, so the site can be served from a CDN or from GitHub Pages, and the computation happens in the browser.

The data problem, and the questions that are still unknown

The tool can only answer what its data supports, and the constraints in the questions list are a good way to see the shape of that data.

The nearest-landmark questions imply a dataset of landmarks per category: parks, amusement parks, zoos, aquariums, golf courses, mountains, museums, movie theaters, hospitals, libraries and foreign consulates. The commercial ones are branded specifically, distance to 7-Eleven and distance to McDonald's, which means the data covers individual store locations rather than chains. The coastline distance needs an actual coastline geometry, which osmtogeojson's presence suggests comes from OpenStreetMap.

The train-related questions are the most demanding. Same train line, same nearest major city, same nearest commercial airport, same length of the station's name, same first letter of the train station name and distance to high-speed rail and to rail station all require a rail network with line assignments and station metadata, which is a substantially harder dataset to obtain and to keep current than a list of points of interest.

Custom zones and custom points are the escape hatch, and they matter because they let the tool work when its bundled data does not cover what you need. A custom zone is an area you define, and the occupance match compares against it. A custom point is a location you place, and the nearest match or distance is computed from it. The distance family also covers distance to a custom line or polygon, so a custom shape works with the measuring questions too.

The honest limitation is the unknown questions. The README says the listed questions are the ones implemented so far, and the contributing section's first suggestion is adding more questions, with three issue links. It also says that even if you are not a programmer you can still help by further documenting the unknown questions.

That last point is a real and unusual admission: the remaining work is partly a matter of knowing the game's questions, and someone who knows the game can contribute that knowledge without touching the code. The tool's accuracy for any given round depends on both the implementation and the completeness of the question list, and only the first of those is a software problem.

The other open suggestion in the checklist, custom question presets, points the same way. The tool computes from parameters, and a preset would let a player save a configuration and reuse it, which matters when the constraint set grows to five or six conditions.

Where this tool is the wrong choice

There are three limits, and the first is about the narrowness of the game mode it covers.

The first is that this is specific to Hide and Seek. The repository description, the topics and the whole feature set are scoped to one mode of one game. The Jet Lag The Game has other modes with different question types, and none of that is in scope here. If you want a general map tool for planning trips, this is not that, and the dependency list makes clear why: the geographic libraries are there to answer game questions, not to do routing.

The second is the data freshness problem, and it is not hypothetical. A map of airports, rail lines, hospitals and foreign consulates is a snapshot of the world at some moment, and the game continues. A new commercial airport opens, a train line is extended, a consulate moves, and the tool's answer changes. Because the answers are computed rather than looked up, a stale dataset does not produce an obviously wrong result; it produces a confidently wrong one, and the failure mode is a player following the map to a location the game rejects.

That is the cost of doing the computation client-side from bundled data, and the alternative is a server with a maintained database, which is a much larger thing to run for a fan project.

The third is the state of the codebase. The README says the project has evolved significantly, encompassing over 10,000 lines of code, and that many complex features have been developed. The contributing checklist has Refactoring code as an open item alongside Tests, Custom question presets, enable or disable specific bus or train routes, and manually define bus or train routes. Five open items on a ten-thousand-line codebase, one of which is a refactor and one of which is tests, is a picture of a project that grew faster than its structure.

The practical consequence is that a new contributor faces a large codebase without the safety net of a test suite, which is a discouraging combination. The one item marked done in the checklist, copy coordinates of right-clicked point on map, shows that the maintainers do work through the list.

The honest alternative is to use the game's own hints and a general map, accepting the trial-and-error the tool exists to remove. For a player who wants a rough idea of where to look, a phone map plus the game's clue will often be enough. What the tool adds is certainty, and certainty requires the data to be right, which is exactly the part that is hard to guarantee.

Editorial conclusion

Adopt JetLagHideAndSeek if you play Jet Lag The Game's Hide and Seek and want to see where the valid hiding places actually are rather than guessing one at a time, since the map computes and plots each round's answer set. Do not adopt it for other Jet Lag modes, because the project covers the Hide and Seek variant only. Before you rely on a result, remember the README states that some questions are not yet known, so check the missing-questions issue before trusting a round, and note the last push was on 2026-08-28 with no tagged releases.

Frequently asked questions

What is JetLagHideAndSeek?

It is a tool to trivially generate interactive maps for viewing hiding possibilities in Jet Lag The Game's Hide and Seek. It computes the set of locations satisfying the round's constraints and plots them, rather than having you test candidates one at a time.

Which Hide and Seek questions does JetLagHideAndSeek support?

The implemented questions fall into four families: Radius and Thermometer with a single All option each, Matching with about twenty options including same zone, same train line and nearest landmark matches, Measuring with distance to coastline, airports, cities, rail, 7-Eleven, McDonald's and landmarks, and Tentacles listing the locations that count as hiding places in a tentacle round.

How do I run JetLagHideAndSeek locally?

You need git, Node.js version 24 or earlier and pnpm. Clone the repository, run pnpm install to install the dependencies, then pnpm dev to host the site. The package.json scripts are astro dev, astro build and astro preview, with pnpm lint running eslint --fix over src and prettier over the tree.

What technology does JetLagHideAndSeek use for mapping?

It is an Astro site with React, using Leaflet with leaflet-draw, leaflet-contextmenu and leaflet-easyprint for the map, ArcGIS packages for basemaps and geocoding, Turf and d3-geo with d3-geo-voronoi for the geometry, and osmtogeojson for OpenStreetMap data. State is handled with Nanostores, including the persistent variant.

Can I contribute to JetLagHideAndSeek without programming?

Yes. The README says that even if you are not a programmer you can still help by further documenting the unknown questions. The contributing checklist also lists adding more questions, custom question presets, enabling or disabling specific bus or train routes, and manually defining bus or train routes as open items.

Official sources

  1. Issues
  2. License: MIT
  3. Project website
  4. README
  5. taibeled/JetLagHideAndSeek on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/taibeled-jetlaghideandseek.svg)](https://hysenlabs.com/projects/taibeled-jetlaghideandseek)

Was this useful?