{"id":44596811,"url":"https://github.com/voluminor/maphub","last_synced_at":"2026-02-14T08:30:39.679Z","repository":{"id":337334233,"uuid":"1152738132","full_name":"voluminor/maphub","owner":"voluminor","description":"An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization, and a PWA build so everything works without an internet connection.","archived":false,"fork":false,"pushed_at":"2026-02-09T00:45:46.000Z","size":14708,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-09T06:33:06.737Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://maphub.webtools.download/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/voluminor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-08T11:01:02.000Z","updated_at":"2026-02-09T01:00:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/voluminor/maphub","commit_stats":null,"previous_names":["voluminor/maphub"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/voluminor/maphub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voluminor%2Fmaphub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voluminor%2Fmaphub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voluminor%2Fmaphub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voluminor%2Fmaphub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voluminor","download_url":"https://codeload.github.com/voluminor/maphub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voluminor%2Fmaphub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29440271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T07:24:13.446Z","status":"ssl_error","status_checked_at":"2026-02-14T07:23:58.969Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-14T08:30:38.834Z","updated_at":"2026-02-14T08:30:39.670Z","avatar_url":"https://github.com/voluminor.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fantasy MapHub Generators\n\n[Перейти к Русской версии](./README.RU.md)\n\n## Technical part\n\n### Build and publishing\n\nTo build, it’s enough to run `npm run build` so that the project is fully built into the `dist` folder.\n\nTo make it available locally in the browser, run `npm run preview`.\n\nWhen deploying to a server, it’s enough to move the contents of the `dist` folder to the root.\n\n### Other features\n\nThis project is built based on predefined values and page templates; to make changes, it’s enough to interact with these files:\n\n-[package.json](./package.json)\n-[static.config.mjs](./static.config.mjs)\n-[pages.config.mjs](./pages.config.mjs)\n\nIf needed, you can “cut out” only one specific generator — at the code level they are self-contained and independent of their neighbors.\n\nWork with data is built on the proto-first principle, while keeping support for older JSON export formats. If you plan to create your own solution using this generator, I recommend relying only on binary proto files, because JSON import/export is primarily focused on supporting older variants and the original watabou generators. Proto files, in turn, guarantee long-term support even if new functionality is added — old saved files will be supported in new versions without losing backward compatibility.\n\n### Binary file structure\n\nAll binary files are generated from proto definitions located in the [protobuf](./protobuf) directory.\n\nImport accepts both raw binary proto objects from root structures and objects wrapped in a typed envelope with CRC32.\n\nThe envelope follows a simple format: `|DataType uint32|{protobuf binary}|crc32IEEE({protobuf binary})`\n\nType identifiers are also defined in proto: [DataType](./protobuf/data/enum.proto)\n\nRoot structures:\n\n- [GeoObj](./protobuf/data/geo/obj.proto)\n- [DwellingsObj](./protobuf/data/dwellings/obj.proto)\n- [PaletteMfcgObj](./protobuf/data/palette/mfcg.proto)\n- [PaletteVillageObj](./protobuf/data/palette/village.proto)\n- [PaletteDwellingsObj](./protobuf/data/palette/dwellings.proto)\n- [PaletteViewerObj](./protobuf/data/palette/viewer.proto)\n- [PaletteCaveObj](./protobuf/data/palette/cave.proto)\n- [PaletteGladeObj](./protobuf/data/palette/glade.proto)\n\n## About the project\n\nThis project is a consolidation into one project of map generators by [watabou](https://github.com/watabou/) that he published at [watabou.github.io](https://watabou.github.io). Not all of them are publicly available, and even what is available is written in a not-so-popular language.\n\nI took the web version implemented in JS and made many changes to it.\n\nThe work is not finished yet; the final goal is to get a fully self-contained generator and editor that requires no external resources and can conveniently describe an entire world, from a high level (planet) down to a low level (houses, clearings, and caves).\n\n### What was changed overall:\n\n- These generators are now fully local. That is, they can work without the internet: all connections are internal, and the downloaded files are included in the project.\n- Maximum automation has been implemented. You can conveniently assemble everything for your use case by interacting only with constructors and JSON parameters.\n- I wrote `openapi.json` for the generators and made it available directly via RapiDoc.\n- I changed the marshalling approach, making it proto-first.\n- I added import/export to a binary file: pure protobuf. Backward compatibility is preserved.\n- I tried to standardize the context menu so that items in different generators are in the same places and have the same names. I also added functionality for those generators that didn’t have it (`Permalink...`, `Fullscreen`).\n- I added the ability to open cities and villages directly in the 3D viewer (`View in 3D`).\n- I made dialogs more user-friendly (for example, it now clearly reports what the problem is during import).\n- I added prefixes for exported files (`*.palette.mf.json`, `*.mf.json`) so it’s clear what relates to what without looking inside.\n- I published it as a separate [web resource](https://maphub.webtools.download), including a [PWA](https://en.wikipedia.org/wiki/Progressive_web_app), which makes it possible to install it as an app that doesn’t need the internet.\n\n### Plans for the future:\n\n- ~~Move palette import/export to proto.~~\n- Add export for Cave/Glade Generator.\n- Add the ability to import schemes from a file for all generators except City Viewer (since City Viewer already has import).\n- Add a 3D visualizer for buildings (separate or just extend City Viewer functionality).\n- Add an advanced export mode that transfers names, labels, and other fields.\n- Add generation of Cave/Glade pointers in Medieval-Fantasy-City/Village Generator.\n- After advanced export, it will be possible to link Cave/Glade/Dwellings Generator and Medieval-Fantasy-City/Village Generator.\n- Make it separately buildable or extend the current build with a list of saved maps and palettes directly in the app.\n\n## Gallery\n\n### How the context menu changed\n\n#### Cave/Glade Generator\n\n![to\\_cave](.github/img/to_cave.png)\n\n#### Dwellings Generator\n\n![to\\_dwellings](.github/img/to_dwellings.png)\n\n#### Village Generator\n\n![to\\_village](.github/img/to_village.png)\n\n#### Medieval-Fantasy-City Generator\n\n![to\\_mfcg](.github/img/to_mfcg.png)\n\n#### City Viewer\n\n![to\\_viewer](.github/img/to_viewer.png)\n\n### Example of an installed app\n\n#### Installed on a phone: a separate icon, works even without the internet\n\n![to\\_village](.github/img/mob_app.jpg)\n\n#### Example of working without the internet\n\n![to\\_village](.github/img/mob_city.jpg)\n\n## CONTRIBUTING\n\nIf you want to join or just fix a bug — send a pull request with a description.\n\n## LICENSE\n\nThe source code is published under MPL-2.0.\n\nContact email: [mail@sunsung.fun](mailto:mail@sunsung.fun).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoluminor%2Fmaphub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoluminor%2Fmaphub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoluminor%2Fmaphub/lists"}