Skip to content

Releases: tpetedb/vibe-map

0.12.1

Choose a tag to compare

@tpetedb tpetedb released this 24 Sep 10:02
9a50dca

Fixed

  • With Settings, Vault set to Grow, Galaxy's Learn button opens the next lesson on the journey, and every lesson already done, instead of a lock that asked for island play a Galaxy learner never does. Topics further along stay earned, and the islands unlock exactly as before.
  • just start keeps "Claude, YOLO mode" (claude --dangerously-skip-permissions) greyed out, with a hint that it skips every permission prompt, until both lessons that teach permissions are done: Hooks as gates (Evening 3, stop 4) and Claude Code, the power settings (Evening 4, stop 5). The toolbelt's "YOLO: install everything" button is unchanged. In the game, the first lesson points at those two lessons for permissions in depth.

0.12.0

Choose a tag to compare

@tpetedb tpetedb released this 24 Sep 08:10
5735434

Added

  • Galaxy, a second way to travel the same course. Settings, Experience, switches between the islands and Galaxy, which follows the history of programming: every topic of the tech tree is a stop on one ordered journey across three globes (the Earth, the data centre and the cloud), each place where a topic happened is a tiny domed miniature, and the next stop is marked and readable from the overview (with Settings, Vault set to Grow and no topic done, the first lesson can stay locked until 0.12.1; Vault set to Full shows it). The islands stay the default, unchanged by the switch, both share one progress, and progress imported from the terminal or a code shows on the route at once. Travelling the world or importing progress keeps the experience you chose, and switching back puts the island camera where it was.
  • In Galaxy you land in a place and walk it with the keyboard, the touch stick or a tap on the ground; buildings, water and the shore stop you, and walking up to a pavilion names its lesson, which Open nearby lesson or Enter opens. Where you are follows the lesson you reached, not the last place picked on the map. The whole journey is also a plain list next to the scene, for a keyboard, a screen reader, a short screen or a browser without WebGL, and its names, progress and Learn buttons follow the text size setting without running off a phone.
  • Every one of the seventy topics says where it happened: 97 dated origins at 39 places, among them Codd's relational model at IBM San Jose in 1970, the web at CERN in 1990 and Kubernetes announced in San Francisco in 2014, each with the year, the actor, one plain line and a source that was opened and supports all of it. A topic sits at a town only when a dated first-party page puts it there; where no page names a place (a format, a specification, an open-source project, an online announcement) it sits at the internet or a standards body rather than at a guessed office, and the pages behind each origin are listed under the topic's sources so a learner can open the proof.
  • vibe places lists the places by era with the topics that come from each, vibe places <id> shows one of them, and vibe topic <id> shows a topic's origins. The data is one file per place under vibemap/data/places/ and [[origins]] on a topic; vibemap/places.py refuses what it cannot vouch for, such as an ambiguous year or a duplicate place, and the weekly link check opens the place sources too.
  • Photo mode (the Photo button, or P): the HUD steps aside, the camera pulls back one step, and Take photo hands over the drawn frame as a PNG with a caption, to save, or to share where the browser can share files. Opening a panel ends it, and Done gives the focus back to the Photo button.
  • The Roadmap's sync card says how many stops live only in this browser, or were delivered since the last export, and the line goes once a code is exported. Stops that arrived in an imported code count as carried. Reset to greenfield says the same before it clears anything.
  • After about fifty minutes on screen in one sitting, Rolinda says once, between stops, that this is a good place to stop and where you are. Keep going, Escape or Stop reminding me closes it; a hidden tab, a gap of ten minutes or nobody at the keys earns nothing.
  • Walk me there. A stop picked in the search palette (Cmd K, then Walk there or Shift and Enter), a plot tapped on the map or a row in the big map's list of stops sets the walker off for it, and the island says where it is going. The way goes round the hub, the lake and the bays, for a tap on the ground as much as for a stop; a walk that cannot get nearer, to the hub's roof or across a shut bridge, stops and says so, and leaving the island ends it. The Roadmap has no Walk there button yet, and a stop on another island is not walked to.
  • The marker where you are walking to stays lit until you arrive, with dashes on the ground that follow the way round, light on dark so they show on grass, snow, sand and lava rock alike.
  • An arrow at the edge of the screen points at the next stop with its distance, and at the bridge that has opened once the island is finished. It takes no press of its own, so a tap under it reaches the island, and it is off at the two hardest difficulties. Settings has no row for it yet, so the difficulty is the only switch.
  • The map grows with its Bigger button, or a long press on a phone, and every stop is a labelled button under it for a keyboard or a screen reader.
  • Hurrying: hold Shift, or push the stick to its rim, to move half again as fast, and "Tap to hurry" in Settings now does what it says. Shift with Tab does not hurry, and changing apps releases held movement keys.
  • The island pauses when you look away: a hidden tab or a locked phone stops the ambient clock, so coming back is not an hour of boats, birds and weather in one jump. Battery saver also draws half the frames after a minute with nothing touched and no panel open, back to full rate at the next key, tap or stick; setting it to Keep running turns both off.
  • A short buzz on a claim, an achievement and a collectible where the browser has one (Android Chrome; iOS has none), gated by the Buzz setting, silent under reduced motion and never asked for before you have touched the page.
  • The Backpack has a Notifications tab: every message the island has shown, newest first, with its time, so what a toast said while you were reading can be read late. Quiet mode raises no toast and keeps the list, at most three cards are on screen at once, a first-time hint shows once, and a quiet "Saved" mark follows a save.

Changed

  • The first lesson no longer tells a beginner to answer yes to a permission prompt they do not understand. Its Definition of done, in the game and in the syllabus, says to pause, read what Claude wants to run or change, and ask Tom before saying yes, and a test checks the learner-facing text it scans for an unguarded instruction to approve a permission prompt.
  • vibe new, a new camp's agent rules and the Codespaces path say plainly that the camp, the coding-agent subscription and any Codespace bill belong to the learner, and the Codespaces path starts from the learner's own repository.
  • The Cycle 3 guide documents the dashboard, the avatar and the archipelago.
  • The data-engineering lesson says that keeping Bronze data append-only is this camp's exercise policy; a medallion architecture can also apply change-data capture updates.
  • For maintainers: the build reads the game's modules from src/game/ and src/galaxy/ by file name, with boot last, and ADR 0001 and docs/CONFIG.md say so; the islands sit behind the experience contract of ADR 0015, held by golden pictures in tests/golden/; docs/CONTRACTS.md lists what other agents depend on; every browser test takes its page from one fixture (a noon clock, a record of every toast, screenshots only under tests/out) and a wait that runs out names itself; CI shards stop when the battery cannot be collected and the browser cache follows the Playwright version; tools/work.py judges each order on its own branch; one tested command regenerates the whole played camp; and the daily news opens a pull request instead of pushing to main.

Fixed

  • An artifact's yellow ring is drawn at the radius the walk-up test uses, so "walk up to the yellow ring" is true everywhere: the fountain's ring is on the grass, not under the lake, the mountain's is clear of the mountain, and on a finished island a delivered stop's slab no longer cuts one in half.
  • The market stall answers a path it does not have with 404 and a body it cannot read with 400, as its demo shows, so the code says which half was wrong.
  • The vault links at the foot of an artifact sheet are links: the vault's colour and underline, the yellow focus ring every other control has, and Enter opens the note.
  • A second demo button cancels what the first still owed instead of interleaving two transcripts; under reduced motion a demo prints its whole transcript at once and a screen reader hears one line at a time; a line too wide for the panel folds with a hanging indent, and a number such as "1 200 tokens" no longer breaks across two lines on a phone.
  • The balloon demo charges the region it rents in: t3.small in eu-west-1 is 0.0228 USD an hour, and a month of forgetting it is 16.42 USD. The mountain demo names vibemap/cli.py, the file the package has, and its columns line up again.
  • The "Do it for real" walkthrough and the demo terminal are drawn with ligatures off, so a fork's typeface cannot join -> or -- in a line the learner is told to copy exactly.
  • An open panel starts and scrolls below the HUD, so a lesson scrolled past the first screen no longer slides behind the bar, and the band it keeps clear grows with the bar on a touch screen.
  • An achievement message hangs under the HUD instead of over Stats, Vault, Tree, World, More, the map or the panel's Close button, and moves nothing on its way. A batch of them stacks within the room between the bar and the bottom buttons, newest on top, each takes the whole row (half the lines on a phone) and carries its own surface, so it reads over a panel and over the island alike.
  • The panel is announced as a named dialog, opening the More menu on a laptop no longer blanks the numbers beside it, and a group heading that wraps has room between its lines.
  • A tech tree shelf outside your interests is set back with its surface rather than dimmed to a fifth of its contrast, so its description reads on a touch screen.
  • Achievements earned on a slow-rendering device arrive promptly, and a hidden page and reduced motion are still respected.
  • The generated Git and Python topic notes open in the game, and a duplicate note title stops the build and names every file that defines it.
  • vibe scores treats an existing empty scores file as an empty scoreboard.

0.11.0

Choose a tag to compare

@tpetedb tpetedb released this 21 Sep 11:12
939d550

Added

  • The island can be zoomed. The mouse wheel, a trackpad pinch, two fingers on a phone, the plus and minus keys and a small control on the right edge of the stage all move one camera between three framings: close on the walker, the whole island (the 0 key, or the middle button), and the archipelago with its bridges. A fresh browser now starts close, so the walker, the companion and the name plates read on a phone; the level is kept in Settings, survives a reload, and "Back to the defaults" resets it. Under reduced motion the zoom steps instead of easing, and while the title screen is up the control sits behind the panel and takes no tab stop. The numbers are in the CAM block of src/config/00-config.js.

  • Messages in a bottle. Two bottles lie near the shore of every island; walking over one opens a note with a lesson that really happened while this game was being built (three red tests with one cause, a flaky test that was the birthday problem, a release that got jumped in the queue, a night lost to a spend limit), with a link to the tech tree topic it belongs to. The Backpack keeps the ones you have read. They are not collectibles: no count, badge or progress code knows them. The text lives in vibemap/data/items.json under bottles.

  • In the game, the companion cheers when a stop is claimed, with the happy row every pack already carried. It is a third larger, its pixels are always a whole number of screen pixels so they stay crisp at every zoom, it keeps its colours at noon and takes the moonlight at night, and it no longer gets left behind a stretch of water or jumps onto the walker when a bridge is crossed.

  • Every command block in the game has a Copy button: the lessons, the setup guide, an artifact's task and a stop a camp adds. It says "Copied" where you can see it and where a screen reader can hear it, and when the clipboard is missing or refused it selects the command and names the key to press. A command written with <your_name> copies with your name in it, shell safe, and says so when there is no name yet.

  • A Continue card on the title screen and at the top of the Roadmap: the next open stop of the island you are on, its goal, the one command for it with a Copy button, and a button that opens it.

  • The Roadmap says which island you are standing on, how much of it is delivered, and marks the one row to open next.

  • The screen stays awake while a panel is open, where the browser has the Screen Wake Lock API. It is released when you close the panel or leave the tab, and taken again when you come back.

  • Settings has a text size (Normal, Large, Larger) and a line spacing (Comfortable) with the numbers XAG 101 names: line 1.5, letter 0.12 and word 0.16 times the size. It grows the lesson, the vault note and the title screen and leaves the HUD, the stick and the minimap where your thumb left them. A command block keeps its own tracking, so monospace still lines up.

  • A contrast setting: it follows the platform's own high contrast and forced colours by default, and can be insisted on or turned off. It raises the palette's token values only, so black is still the brand.

  • A handedness setting: the stick, the jump button and the zoom column swap sides for a left hand or a one-handed grip.

  • A quiet setting for the toasts. What a toast would have said is still recorded, so the achievements and the numbers are whole.

  • Settings is grouped under five headings, and a row the browser cannot obey (the buzz, the screen wake lock) is not offered at all. Above Normal a row's value takes the whole width, and the control's own size is capped where its longest option still fits the narrowest phone: a select cannot wrap, so the value is either whole or lost.

  • The syllabus is published from this repository: tools/gen_syllabus.py writes the repetitive blocks of docs/SYLLABUS.md (the course map, the mentors, the artifacts, the tech tree) from vibemap/data/ and renders the whole file into docs/site/syllabus.html, which pages.yml deploys next to the game as syllabus.html. One file, the game's palette, system fonts, a sticky table of contents, print styles, light and dark, and no third-party request. just syllabus regenerates it and --check fails when it is stale.

  • config/camp.toml gains [game] site_url, where the product is published. The game's Roadmap now resolves "the syllabus" through it, so the link is the neighbour on that site and the product's URL anywhere else. No link to a page in a personal claude.ai account is left, and a repo test keeps it that way.

  • The README, the quickstart and a camp's own README say which browsers the game is supported in: Chrome on desktop and on Android is the one it is built and fixed for, an iPhone is best effort because every iPhone browser runs Apple's WebKit, and Firefox and desktop Safari should work without being tested beyond that.

  • A link to the game now previews: the page has a description, a canonical address, Open Graph and Twitter card tags, a theme colour and a tab icon that travels inside the one file, so nothing is fetched and no request misses. The Pages workflow publishes the card image next to the game and serves a 404 page in the game's own look with a way home.

  • LICENSE carries the MIT text in full, so GitHub reads the repository as MIT instead of "Other", and src/vendor/ now keeps the three.js and Motion licence texts next to the bundles they cover.

  • SECURITY.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, issue forms and a pull request template: how to report something privately, and the house rules an outsider needs before the first pull request.

  • The camp vibe new writes carries an MIT LICENSE with the year filled in and the name filled in when you gave one.

  • Work orders for agents: a task under work/orders/ names the files it may touch and its acceptance as commands, a different agent rules on it in review.toml, another team's files need that team's sign-off, and tools/work.py checks all of it from the work-* recipes, from Claude Code hooks and in CI. Teams by theme live in work/teams.toml, goals become launch groups with just work-plan, and an order's GitHub issue carries one status comment and a thread agents read only from people who can push. The hooks stay out of a learner's camp.

Changed

  • The documents an agent or a newcomer reads first now match the product. HANDOVER.md is gone: it was dated, named the retired vibe.toml, sent readers to vibemap/tech.py and asked for setup that shipped long ago, and everything in it that still held is in AGENTS.md, docs/MAINTAINERS.md, docs/BRIEF.md and the develop-camp skill. The README leads with the live game, a quickstart that was run as written, and what you have to bring yourself: your own machine, your own repository and your own coding-agent subscription. docs/SKILLS.md lists every skill that ships (council and justfile were missing), docs/DESIGN.md quotes the tokens that really are in src/style.css, and both are now guarded by a test. The camp-facing skills stop naming files only a product checkout has: install-camp, python-data, duckdb-sql, council and camp-progress describe what a camp can actually run.

  • The finale offers slots ("Friday evening", "Saturday afternoon") instead of five 2026 dates and a note to the maintainer, so a camp's configuration and the published game never read as out of date. A camp still writes its own evenings over them.

  • A browser shard in CI claims its test files by name or by pattern (tests/test_game_qol*.py), and one shard is the default: a browser test file no pattern claims runs there. A new browser test is run from the moment it exists, without an edit to .github/workflows/ci.yml, which is what made two branches that each added one collide. tools/ci_shards.py expands the matrix the same way for the shard jobs and for the guard, and the guard still refuses a file in no shard or in two, now also a pattern that claims nothing, and prints the whole split when it fails.

  • Every picture under docs/media is rendered from the product again by just media and just tui-media, and seven of them are new: the archipelago, the Ask panel, the Stats panel, the Backpack, the Settings rows, the More menu on a phone and a message in a bottle on its shore. A shot whose subject is laid out against the window is taken in a window of that size, so the social card carries the whole title card and the More menu all seven of its rows; the gameplay GIF walks to the 18:00 signpost through the controls a player uses, in a window where the zoom control is not drawn over the minimap; and the just start Welcome screen and campaign map come from the app instead of being kept by hand.

Removed

  • The published site no longer serves the learner's untouched workspace/game/index.html at /your-game.html.

  • interestAnswered() is gone from the game: nothing called it.

Fixed

  • When the browser takes the WebGL context away (a phone short of memory, a tab that slept), the stage says so and the Roadmap opens, instead of a flat blue stage with a HUD that carried on. The island comes back by itself when the context returns.

  • Leaving an island gives its memory back. Every crossing and every fast travel used to leave the old island's geometries, plate textures and shadow map on the GPU, about 170 geometries and a shadow map per switch; so did every mote of dust behind the walker and every change of look.

  • Browser zoom and a move to a screen with another pixel ratio resize the drawing buffer, so the island is no longer drawn at half resolution until a reload.

  • Reduced motion, from the system or from Settings, now stills the 3D view as well: clouds, birds, boats, planes, the windmill, confetti, dust and every pulse stop, and so does Rolinda's typewriter. The walk, the follow camera and the companion's frames stay.

  • Arrow keys and space typed into a text field mov...

Read more

vibe-map 0.10.0

Choose a tag to compare

@tpetedb tpetedb released this 19 Sep 18:17
afab949

See CHANGELOG.md, section [0.10.0]: 25 pull requests since 0.9.0.

Highlights

  • The game looks and plays differently: the camera fits the island on any window, a sky dome with a light rig that follows the time of day, water animated on the GPU, contact shadows, tone mapping, and half the draw calls (a finished island is inside the phone budget on every world).
  • Four islands joined by bridges, with a minimap. An avatar that sits with a laptop, picks up forty items, earns achievements and wearables.
  • Pixel pets (crab, duck, turtle, snail, cat, dog) in the terminal and in the browser game, online too; artists and licences credited in the game.
  • The Ask panel with a loopback chat bridge to your own Claude Code, Codex or Copilot; nothing is paid by the host of the game.
  • A stats dashboard in the game and as vibe dashboard.
  • A live world feed from verified sources, with an off switch. Choose your interests; a justfile module.
  • Topics as data (vibemap/data/topics/), and the data engineering pack: sixteen hands-on topics from CSV to Iceberg, dbt, dlt and Airflow, each with a deterministic check.
  • Devcontainers and Codespaces, CODEOWNERS, vibe new --private.
  • For maintainers: CI on sharded Linux runners (about ten minutes push to green), changelog fragments, just sync-main, just release.
  • Security: feed and chat content is shown as text (a feed item could inject script into the news card, new since 0.9.0 and fixed before this release), links are limited to http and https, the news writer strips markup, and the game no longer loads fonts from a CDN: no request leaves the page's origin.
  • The first 55 fixes from a thirty-sector bug hunt: checks read the learner's own work, the fork build runs on any python3 and refuses a broken game, vault links from artifacts resolve, the walker keeps his seat.

The remaining hunt fixes and a play-feel pass follow in 0.11.0.

vibe-map 0.9.0

Choose a tag to compare

@tpetedb tpetedb released this 17 Sep 17:34
83450d2

The professionalize cycle. Everything the course promised to check, it now checks.

Configuration has three levels, nested, each flat inside. The repository level stays where the tools demand it, the source level is src/config/ for the game and vibemap/data/ for the CLI, and your own journey lives in config/camp.toml. docs/CONFIG.md is one table saying "to change X, edit Y". vibe.toml is still read for one release and says so on every command.

You can fork the game. vibe fork copies the source, the vendor files and the build tool into workspace/forks/vibe-map/ with its own src/config/, and just build there produces your own game file. A new stop on the production island teaches it, with four challenges checked one at a time: the fork exists, its configuration is yours, it carries a topic of your own, and you broke a build and repaired it.

The twenty artifacts became tasks. Each one keeps its demo and gains a "Do it for real" walkthrough written from the official documentation of the thing it stands for, a home in workspace/artifacts/<id>/ and a deterministic offline check. vibe check --artifact <id> reads what you actually built: a Dockerfile that parses and an image that builds, a DuckDB gold table with rows in it, a FastAPI app that answers 200, a workflow file with a schedule and a job. A check that needs a tool this machine does not have says so with the install command instead of failing.

The twelve mentors became encounters. Each has a dialogue of three or four exchanges where every line is a paraphrase of something that person is on record saying, with the link beside it, and one exercise of under fifteen minutes in workspace/mentors/<id>/. vibe check --mentor <id> verifies it offline: Karpathy's bigram model has to print the likeliest character after "a", Torvalds's script has to produce the same blob hash as git. A verified encounter raises a plaque on their spot and earns the mentored badge when all twelve are done.

Every stop with a deliverable is checked on disk. Winter, desert and production read what is there, with your own words in the note as the floor underneath. Four winter stops are genuinely reading only and say so.

The title screen leads with the form, the theme owns the button words and the KPI labels, and the mini-games were audited against what they teach: two cut, three rebuilt, the reasoning in ADR 0005.

CI runs the whole battery on every pull request, with a nightly workflow for the fresh-camp end-to-end run and the full play-through, and browser tests that wait for signals the page produces rather than for a clock.

The docs and the ADRs caught up. ADRs 0006 config levels, 0007 artifacts as tasks and 0008 mentor encounters record why each is shaped the way it is. tools/script_camp.py is one home for the deliverables that prove the checks can pass, used by the tests and by the played instance.

Install or upgrade:

uv tool install --force git+https://github.com/tpetedb/vibe-map@v0.9.0

vibe-map 0.8.0

Choose a tag to compare

@tpetedb tpetedb released this 17 Sep 13:41
84b84e0

See CHANGELOG.md, section [0.8.0].

Highlights: a full play-through by three Opus agents found and fixed 40-odd defects. A stop on winter, desert or production is only green when the learner wrote the note (27 of 32 stops used to pass on an empty camp); vibe undo; vibe scores says no scores yet instead of a traceback; edits to generated vault notes survive grow mode; hints name the real file; the TUI launchers work in a camp. In the game: signpost 4 is reachable, the name field is validated and shell-safe, ?reset keeps who you are, full screen shows the panels, the studio theme pairs coffee not wine, Escape closes panels, workstreams 7 and 8 got real command blocks. Docs separate a camp from the product and every install block uses the git+ URL.

vibe-map 0.7.0

Choose a tag to compare

@tpetedb tpetedb released this 17 Sep 10:43
41735de

See CHANGELOG.md, section [0.7.0].

Highlights: three zones, separated on purpose. The learner's own work lives in workspace/; vibe new writes a slim camp (README, AGENTS.md, vibe.toml, justfile, the learner skills, the hook, a Pages workflow, an empty workspace) from a template inside the package instead of cloning the engine, builds the vault and makes the first commit; vibe play opens the hosted game anywhere. docs/MAINTAINERS.md maps the zones and how a change travels. <your_name> is the default name everywhere. Two roadmap topics with sources: Separation of concerns and Building the builder.

vibe-map 0.6.0

Choose a tag to compare

@tpetedb tpetedb released this 17 Sep 09:45
6500208

See CHANGELOG.md, section [0.6.0].

Highlights: the game onboards on its own (who you are: Lotte, Frank, Max, Rolinda or your own name; how hard; just the game or the full experience with the exact terminal and Obsidian commands, your name and date filled in); every lesson's commands fold at hard and above and stay one click away; a Setup guide on the Roadmap; vibe name and the camp naming convention vibe-map-- as the default of vibe new; a much bigger island where every finished stop grows a causeway and an annex with its flag.

0.5.0

Choose a tag to compare

@tpetedb tpetedb released this 17 Sep 01:59
3ceec12

See CHANGELOG.md, section [0.5.0].

Highlights: grow mode for the vault (start with the hubs, watch the graph grow as you play, everything else waits in vault/_library); settings in the game (map size, full screen, vault mode, pairings, shadows, motion, speed) and a bigger map; vibe news pulls six AI feeds into the vault and the game, refreshed weekly by an action on a forked repo; docs/LONG-GAME.md, the command-by-command setup for the terminal, the game and Obsidian together; a second wave of island artifacts (factory, post office, shop, bank, data centre, energy grid, library, office, households, school) with their own props.

0.4.1

Choose a tag to compare

@tpetedb tpetedb released this 17 Sep 00:51
43bea9f

Patch release. vibe --version reported 0.3.0 after 0.4.0 because the version string was pinned in the package; it now comes from the installed package metadata and a test holds it to pyproject.toml. See CHANGELOG.md, section [0.4.1] - 2026-09-17.