BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A browser-based drawing tool for tabletop board prototyping with multiple grid types, themed palettes, and a dedicated eraser.
Overview
Protogames lets designers sketch and iterate on board layouts quickly—no build step, just open the page and paint tiles. Boards can be saved/loaded as JSON and exported to image/vector formats.
Target Users: Board game designers and prototypers
Platform: Web (static hosting friendly)
Status: MVP developmentREADME 전문 보기 ↗A browser-based drawing tool for tabletop board prototyping: hexagon, square and triangle tiles, boards from simple shapes to real countries, themed palettes and objects, a playtest mode, and export to PNG, SVG, a print-ready PDF or a share link. Try it at protogames.eu.
Protogames lets designers sketch and iterate on board layouts quickly—no build step, just open the page and paint tiles. Boards are saved in the browser as projects, can be saved/loaded as JSON files, shared as a link, and exported to image/vector formats or a PDF at real-world scale.
Target Users: Board game designers and prototypers
Platform: Web (static hosting friendly)
Status: Active development (see Status)
app/data/), with a choice of tiles across and which islands to include, also for multi-country regions (Scandinavia, Balkans, European Union and more) with the borders between the countries highlightedPress ? (or use the keyboard button in the bottom-right corner) for the full list. On macOS use Cmd instead of Ctrl. Shortcuts are paused while you type in a field or a dialog is open.
| Action | Key |
|---|---|
| Undo / Redo | Ctrl+Z / Ctrl+Shift+Z or Ctrl+Y |
| Brush / Fill / Line | B / G / L |
| Eraser on/off | E |
| Start markers on/off | M |
| Smaller / larger brush or eraser (1-7) | [ / ] |
| Pick swatch | 1 - 9 |
| Next / previous swatch | . / , |
| Zoom in / out / fit | + / - / 0 |
| Pan | Space + drag (Space keeps its normal job on buttons, checkboxes and in dialogs) |
| Save project | Ctrl+S, also inside a text field (the only key taken over from the browser); downloads the project file |
| Show shortcuts | ? |
| Move between controls | Tab / Shift+Tab (the app never takes Tab, so the board is not a keyboard trap) |
| Cancel a line or a drag, close the top dialog, leave playtest | Esc (one layer at a time, topmost first) |
In playtest, keyboard play uses the same keys on real controls: Tab to a tray piece and press Enter or Space to send it to a free start; Tab to the piece list, then the arrow keys move the focused piece one tile and Delete or Backspace returns it to its tray; Esc cancels a drag, then leaves playtest. Undo and redo step through piece moves.
V is reserved for the Select tool, which does not exist yet.
Painting and navigating never share a gesture, so you cannot pan by accident while painting:
| Input | Paint | Navigate |
|---|---|---|
| Mouse | click / drag | wheel = zoom at the pointer; Space + drag or middle-button drag = pan |
| Touch | one finger | two fingers: drag to pan, pinch to zoom (a stroke in progress is undone when the second finger lands; the finger left behind does not paint until you lift it) |
| Stylus | pen | wheel, Space + drag, or the on-screen controls |
The cluster in the bottom-right corner has zoom out / in, the zoom level (click it for actual size, where a typical tile is 64 px wide), fit to screen, and a minimap toggle. The minimap shows the whole board with the visible area outlined; click or drag on it to move the view. Zoom is clamped between 25% of the fitted size and 24x, and the board can never be panned completely out of sight.
localStorage (about 5 MB per site, shared by all projects; the editor says so when it is full), is saved as you work, and is not uploaded anywhere. The home page (/) lists your projects. Clearing the site's data deletes them, so keep a file of anything you care about.<name>.protogames.json; Load… > Import a project file… opens it again, here or on another computer. Files from older versions of the app are upgraded when opened; files from a newer version are refused with a message. The formats are in docs/SPECIFICATION.md.The Themes panel in the sidebar has two groups, Tile themes (a colour palette whose tiles may have a texture picture) and Item sets (the pictures of placeable objects). For each: Create opens an editor in the app, the file button imports a .json file or plain images (an image becomes a tile or an item named after its file), the export button saves a theme as JSON, and JSON template downloads an example to edit:
{ "type": "protogames-tile-theme", "name": "My Tile Theme", "tiles": [ { "label": "Bog", "hex": "#4b5d3a", "image": null } ] }
{ "type": "protogames-item-set", "name": "My Item Set", "items": [ { "label": "Outpost", "image": "https://example.com/outpost.png" } ] }
image is a web address or a data: URL. Imported themes are kept per browser (localStorage).
main is published as the production site at https://protogames.eu/ (landing page at the root, the editor at /app/); every open pull request from this repository (at most 20) is published as a preview under /preview/pr-<number>/ (editor at /preview/pr-<number>/app/), with its own saved data and a badge, and the link is commented on the pull request. Production loads one third-party script, anonymous page-view analytics; previews and the landing page do not. See docs/DEPLOYMENT.md.
File paths such as js/shortcuts.js in this README and in docs/ are relative to app/, where the editor lives.
protogames/
├─ index.html (landing page; landing.js forwards old share links to the app)
├─ landing.js
├─ package.json
├─ LICENSE (GNU AGPL v3)
├─ app/ (the editor: open or serve this folder)
│ ├─ index.html
│ ├─ styles.css
│ ├─ js/
│ │ ├─ config.js (constants, palettes, defaults)
│ │ ├─ state.js (application state, undo/redo)
│ │ ├─ geometry/ (helpers.js, hex.js, triangle.js, square.js, neighbors.js) + geometry.js (aggregator)
│ │ ├─ viewMath.js (pure zoom/pan maths)
│ │ ├─ viewControls.js (zoom, pan, fit, minimap, texture toggle)
│ │ ├─ renderer.js
│ │ ├─ textureUtils.js (colour helpers and blob-URL cache shared by textures and objects; loads before both)
│ │ ├─ textures.js (procedural tile textures)
│ │ ├─ objects.js (placeable map objects)
│ │ ├─ interactions.js
│ │ ├─ toolOps.js (fill and line tool logic)
│ │ ├─ toolbar.js (the tool column and its settings popovers)
│ │ ├─ panels.js (folding of the sidebar panels, remembered per browser)
│ │ ├─ boardPicker.js (the board-shape list with a picture of every layout)
│ │ ├─ focusUtils.js (keyboard-focus rules: typing targets, Tab trap, open layers; loads before the modules that use it)
│ │ ├─ shortcuts.js (keyboard bindings)
│ │ ├─ projectFormat.js (project file format: versions, migrations, validation)
│ │ ├─ projectLibrary.js (the projects kept in the browser; the home page uses it too)
│ │ ├─ fileManager.js (save/load files, autosave, opening projects)
│ │ ├─ shareLink.js (share links: board in the address hash)
│ │ ├─ playtest.js (locks editing, runs the game)
│ │ ├─ playtestTray.js (player trays and dice)
│ │ ├─ playtestDrag.js (moving pieces by pointer and keyboard)
│ │ ├─ playersPanel.js (the Players panel)
│ │ ├─ players.js (player list helpers)
│ │ ├─ play.js (game state: pieces, moves, rolls)
│ │ ├─ pieces.js (drawing and hit-testing of pieces)
│ │ ├─ dice.js (dice rolling)
│ │ ├─ infinite.js (infinite canvas board shape)
│ │ ├─ countryBoard.js (country board shape, cut to a real outline)
│ │ ├─ countryRegions.js (multi-country regions and their borders)
│ │ ├─ themeManager.js (custom tile themes and item sets)
│ │ ├─ themeEditor.js (theme editor dialog)
│ │ ├─ print.js (print layout at real-world scale + PDF writer)
│ │ ├─ exportDialog.js (the Export… dialog: Print, PNG, SVG and project file tabs)
│ │ ├─ loadDialog.js (the Load… dialog: projects of this browser, file import)
│ │ ├─ exporter.js (PNG and SVG export and their options)
│ │ ├─ ui.js
│ │ ├─ utils.js
│ │ └─ main.js
│ ├─ showcases/ (example .protogames.json projects)
│ ├─ images/ (the logo and the favicon)
│ └─ data/ (countries-50m.json: outlines for the Country shape; its README has source and licence)
├─ tests/ (node:test suites, roughly one per module, plus generatorVersion, scriptOrder and
│ others that guard the whole app; fixtures/ of old file formats; support/ with load.js and fakes.js)
├─ dev/ (geometry-gallery.html, geometry-checks.js, build-showcases.js: writes the board-game showcases)
├─ scripts/ (build-site.js: assembles production + previews for Pages; preview-runtime.js: storage prefix and badge of a preview)
├─ .github/ (workflows/ test.yml and pages.yml, issue templates, FUNDING.yml)
└─ docs/
├─ README.md (index of all documents, each marked reference / research / proposal / archive)
├─ SPECIFICATION.md (file, autosave and share-link formats, generator versions)
├─ DEPLOYMENT.md (production, previews, how the site is built)
├─ PLAYTEST.md (how playtest works)
├─ TILE_GENERATION_EXPLANATION.md
├─ audits/ (register.md = the current state of all findings; dated audit reports and their area reports are frozen logs;
│ start with audits/README.md for the rules)
├─ research/ (board-topologies/: survey of the maps of published games with its schematics; hex-maps-reading-list.md; playtest-ideas.md: backlog)
├─ proposals/ (playtest-secret-screens.md: a proposal for hidden information on several devices, not built)
└─ archive/ (original-prd.md: the original product requirements, historical)
Almost all of this happened in October 2026; before that the project was the board generator, the palettes and the eraser (November 2025).
python -m http.server 8000 --bind 127.0.0.1, and open / for the landing page or /app/ for the editor. Opening app/index.html directly from the disk also works for drawing, but the Country shape and the showcases load files and need a server..protogames.json file, a PNG/SVG, or a PDF at real-world scale; Share Link copies a link to the board.js/config.js.DEFAULT_TILE_COLOR defines the blank/erased colour; palettes are declared in COLOR_PALETTES.The app itself needs no tooling. The tests need Node.js 22 or newer (no dependencies to install).
npm test
Runs the Node test runner over tests/**/*.test.js (over 700 tests, about half a minute). The app's browser scripts are plain IIFE files, so tests/support/load.js evaluates them in an isolated vm context instead of needing a bundler or a DOM.
The geometry tests (tests/geometry.test.js, tests/neighbors.test.js) cover every fixed board shape (hexagon, rectangle, triangle, circle; the infinite canvas is tested in tests/infinite.test.js, the country board in tests/countryBoard.test.js) x tile shape x orientation combination: expected tile counts, no duplicate or overlapping tiles, correct bounds, centring inside the drawable area, hit-testing and tile adjacency (symmetric, correct neighbour counts). Every fixed shape bug has a regression test. When you fix a geometry bug, add a case there.
dev/geometry-gallery.html renders every combination as a thumbnail, runs the same checks as the tests, and marks failing combinations in red and unsupported ones as dashed "invalid" cards with the reason. Serve the repository root with any static server and open the page:
python -m http.server 8000 --bind 127.0.0.1
# then visit http://localhost:8000/dev/geometry-gallery.html
Optional query parameters change the sizes, e.g. ?radius=5&size=8&width=10&height=6.
All shortcuts live in BINDINGS in js/shortcuts.js (id, label, group, keys). Add the binding there, add its action to ACTIONS further down the same file, and mark any button that triggers it with data-shortcut="<id>" so its tooltip shows the key. tests/shortcuts.test.js fails if two bindings use the same key.
There is no bundler: app/index.html lists every script with defer and the browser runs them in that order, so a module must come after the ones it uses while loading (for example textureUtils.js before textures.js and objects.js, focusUtils.js before the modules that use it, projectFormat.js before shareLink.js and fileManager.js). tests/scriptOrder.test.js fails when a file under app/js/ is missing from the page or listed twice, when one of those orders is broken, and when the list does not load in a bare context.
A showcase is an ordinary project file. Save a project from the editor (Export… > Project file) as app/showcases/<id>.protogames.json, then add { id, name, description, file } to SHOWCASES in js/config.js (the file must be showcases/<id>.protogames.json). It opens at app/?showcase=<id>, which is how the landing page links to it. tests/showcases.test.js checks that every listed file exists and loads, and that every file in the folder is listed. The board-game showcases (chess, island settlers, peg solitaire, Chinese checkers) are written by node dev/build-showcases.js from the app's own geometry; rerun it after changing their palettes or layouts.
A tile theme is an entry in COLOR_PALETTES in js/config.js (id, name, description, colors as { label, hex }). A tile's colour is its identity: it selects the texture and the label (js/textures.js), and a colour that is retired from an existing palette needs a migration of saved files (see "v1 to v2 colour map" in docs/SPECIFICATION.md). An item set is an entry in THEMES in js/objects.js, with the drawings of its items. For a theme that is only yours, use the Themes panel instead (see above).
A change to anything that is saved (project file, share link, board generator) follows the rules in docs/SPECIFICATION.md: bump the version, add a migration, add a fixture of the old format to tests/fixtures/, and update the specification. The tiles a generator produces for existing settings never change; that is a new generator version.
.github/workflows/test.yml runs npm test on every push to main and on every pull request, so a failing test fails the check.
main. The tests must pass; the pull request gets its own preview of the site (see Deployment and previews), so you can try a change before it is merged.audits/README.md for the rules; audits/register.md is the one file with the current state of every finding, dated reports are frozen).The plan is tracked in the Roadmap issue (#52), grouped into phases that are ordered by dependency: 1 Foundations and quick wins (done), 2 Editing power and data, 3 Edges, roads, borders, 4 Output, sharing, onboarding, 5 Later. Each item is an issue with a phase-<n> label. Besides that:
V is reserved for it) and an editor for the dice set are not built yet.Protogames is free software under the GNU Affero General Public License v3 (AGPL-3.0-only). The country outlines in app/data/ are under their own terms, see app/data/README.md.
Active development. Last updated: October 2026.