{"id":50685402,"url":"https://github.com/dsazz/gothic-remake-lockbreaker","last_synced_at":"2026-06-11T08:00:29.885Z","repository":{"id":363076112,"uuid":"1261869601","full_name":"Dsazz/gothic-remake-lockbreaker","owner":"Dsazz","description":"A clean-path solver for the Gothic 1 Remake lock puzzle — finds the shortest turn sequence that never snaps your pick. Vanilla JS, no dependencies.","archived":false,"fork":false,"pushed_at":"2026-06-08T22:14:29.000Z","size":8959,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T22:34:28.995Z","etag":null,"topics":["fan-made","game-tools","gothic","gothic-1-remake","lockpicking","puzzle-solver"],"latest_commit_sha":null,"homepage":"https://dsazz.github.io/gothic-remake-lockbreaker/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dsazz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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-06-07T09:04:29.000Z","updated_at":"2026-06-08T22:14:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Dsazz/gothic-remake-lockbreaker","commit_stats":null,"previous_names":["dsazz/gothic-remake-lockbreaker"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Dsazz/gothic-remake-lockbreaker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dsazz%2Fgothic-remake-lockbreaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dsazz%2Fgothic-remake-lockbreaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dsazz%2Fgothic-remake-lockbreaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dsazz%2Fgothic-remake-lockbreaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dsazz","download_url":"https://codeload.github.com/Dsazz/gothic-remake-lockbreaker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dsazz%2Fgothic-remake-lockbreaker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34188272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["fan-made","game-tools","gothic","gothic-1-remake","lockpicking","puzzle-solver"],"created_at":"2026-06-08T22:32:34.474Z","updated_at":"2026-06-11T08:00:29.866Z","avatar_url":"https://github.com/Dsazz.png","language":"JavaScript","funding_links":["https://ko-fi.com/swarmconductor"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/hero.webp\" alt=\"Gothic Lock Breaker\" width=\"100%\" /\u003e\n\n# Gothic Lock Breaker\n\n### An edge-safe solver for the Gothic 1 Remake lockpicking puzzle\n\nStop snapping picks on the Old Camp tower door. Map the lock, hit **Break the Lock**,\nand get the exact run of turns that seats every pin in the notch — without ever grinding\none against the frame.\n\n\u003cbr /\u003e\n\n[**Open the solver →**](https://gothiclockbreaker.com/)\n\n\u003cbr /\u003e\n\n[![Play online](https://img.shields.io/badge/play-gothiclockbreaker.com-e9b969?style=for-the-badge)](https://gothiclockbreaker.com/)\n\u0026nbsp;\n[![Featured in PC Games](https://img.shields.io/badge/featured-PC%20Games-e9b969?style=for-the-badge)](https://www.pcgames.de/Gothic-Remake-Spiel-73829/News/Schloesser-knacken-Tockpick-Tool-1544814/)\n\u0026nbsp;\n[![Featured in Buffed](https://img.shields.io/badge/featured-Buffed-e9b969?style=for-the-badge)](https://www.buffed.de/Gothic-Remake-Spiel-73829/News/Schloesser-knacken-Tockpick-Tool-1544814/)\n\u0026nbsp;\n[![Tip jar](https://img.shields.io/badge/tip-Ko--fi-e9b969?style=for-the-badge)](https://ko-fi.com/swarmconductor)\n\u0026nbsp;\n![Version](https://img.shields.io/badge/version-1.13.2-e9b969?style=for-the-badge)\n\u0026nbsp;\n![Dev deps only](https://img.shields.io/badge/npm-dev%20deps%20only-7fb47a?style=for-the-badge)\n\u0026nbsp;\n![Vanilla JS](https://img.shields.io/badge/built%20with-vanilla%20JS-f4cf85?style=for-the-badge)\n\u0026nbsp;\n![Works on iPhone](https://img.shields.io/badge/runs%20on-your%20phone-d68a76?style=for-the-badge)\n\n\u003cbr /\u003e\n\n**Current release: v1.13.2** — see [CHANGELOG.md](CHANGELOG.md) for what changed.\n\n**Localized links for press and communities:** [German (`?lang=de`)](https://gothiclockbreaker.com/?lang=de) · [Polish (`?lang=pl`)](https://gothiclockbreaker.com/?lang=pl)\n\n\u003c/div\u003e\n\n---\n\n## Why this exists\n\nThe Gothic 1 Remake lockpicking minigame is a slider puzzle: each plate's pin must\nend at the **center hole**, but the plates are wired together so moving one drags\nothers along. The trap is the wall — force a pin past the edge and your pick takes\ndamage, then breaks.\n\nMost \"solver\" tools just tell you the *net* number of turns per plate. That answer is\nuseless in practice, because executing it in the wrong order drives a pin into the edge\nhalfway through and snaps your pick. **This one never does that.** It searches the real\nstate space and only ever returns moves that keep every pin in range. The UI stays compact\n— three sections, visual mapper, built-in guide — so beginners are not fighting a spreadsheet.\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"assets/walkthrough.png\" alt=\"Mobile sequence walkthrough: step 6 of 15 — L2 turn left, with 7-hole readout grooves for each lock\" width=\"62%\" /\u003e\n\u003c/div\u003e\n\nYou get a numbered run of turns and a step-through board. Pins against the frame glow\n**red**; pins one nudge away glow **amber** — on the tumbler cards and in the walkthrough —\nso you can watch the sequence stay clear of every wall as you go.\n\n\u003e Garbage in, garbage out: the solver is only as good as the couplings you feed it.\n\u003e If a step doesn't match the game, a link on one of the lock cards is wrong — re-check that lock.\n\u003e Training with Fingers does **not** change how plates move; tap **Something off?** in the\n\u003e walkthrough for a checklist. At **Master**, set picks snapped and tap **Gone** beside dropped couplings.\n\n## Mastery vs solver\n\n| Tier | Mistakes | On pick break | Solver impact |\n| --- | --- | --- | --- |\n| Untrained | 2 | Lock resets | Edge-safe BFS on your mapped couplings |\n| Trained | 4 | Progress kept | Same plate physics — more room for mistakes in-game |\n| Master | 6 | One link removed per snap | Set picks snapped, tap gone links on tumbler cards |\n\nThe BFS never asks you to grind a pin past the wall. Mastery only changes how many wall\nmistakes you can afford in-game and (at Master) which couplings still exist after a break.\n\n## How it works\n\n- Every pin sits in one of **seven holes (1–7)** on its plate. The lock opens when **all pins reach hole 4** (the center notch). Holes 1 and 7 are the walls.\n- Turning a lock one notch also turns its coupled locks one notch — `With` (same\n  way) or `Against` (opposite way). On each lock's card, **Turning this moves** lists\n  every other lock that reacts when you turn that one. Coupling is directional, so turning\n  lock A can move B even if turning B does nothing to A.\n- The solver runs a breadth-first search over the bounded state space and **discards any\n  turn that would grind a coupled pin past `±3`**. You get the shortest fully-safe\n  sequence, or an honest \"no clean path from here\" if one truly doesn't exist.\n\nState space tops out at `7^7 ≈ 820,000` states, so it solves instantly.\n\n## Using it\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"assets/app-screenshot.png\" alt=\"Gothic Lock Breaker on desktop: horizontal tumbler rows with start holes and coupling chips, sticky sequence sidebar with groove readout walkthrough\" width=\"62%\" /\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n1. **The Lock** — choose your **lockpicking tier** (Untrained / Trained / Master), how many\n   locks the mechanism has (4–7; defaults to **6**), and at Master how many **picks you've\n   snapped** on this lock so you can mark dropped couplings on the tumbler cards. Once you change\n   the setup, **Wipe lock** (trash icon) clears couplings, mastery, and returns the count to 6\n   — with a confirm prompt.\n2. **Tumblers** — for each lock (numbered 1 front through N back), mark its **start hole**\n   and which other locks move when you turn it: `·` none, `With` same way, `Against`\n   opposite.\n3. **Break the Lock** — read the focus card, then **Next** to walk the sequence one turn\n   at a time. Each lock row shows a read-only 7-hole groove (like the tumbler cards).\n   After a solve with steps, a **Share lock** banner copies the URL for the current lock.\n   **Minimize** collapses the panel to a compact bar; **Clear** (eraser) drops the\n   solved sequence. Open **Show all N steps** for the full list.\n\nYour lock is saved locally and encoded in the page URL, so you can bookmark a tricky\nlock or paste the copied link to a friend. The footer shows the running version and\nlinks to the changelog.\n\n## Running locally\n\nPlain static files — no build step. Run `make install` once for the local dev server.\nThe page loads Cinzel from Google Fonts; everything else is self-contained.\n\n```bash\nmake install        # first time only\nmake serve          # http://localhost:8000\nmake test\nmake check-version\n```\n\nOverride the port with `make serve PORT=3000`. Run `make` with no args to list targets.\n\n## Architecture\n\nNative ES modules. `app.js` is the composition root; `store`, `solver`, and `view` stay pure and all depend on `domain`:\n\n| File | Responsibility |\n| --- | --- |\n| `src/domain.js` | Constants (`POS_MIN/MAX`, `CENTER`, `LINK`, `DIR`, `MASTERY`) and pure helpers including `effectiveMatrix()`. No DOM, no storage. |\n| `src/solver.js` | Pure `solve()` BFS + `statesAlong()`. Depends only on the domain. |\n| `src/store.js` | Single source of truth for the lock; persistence (localStorage + URL hash) hidden inside. Depends only on the domain. |\n| `src/view.js` | Pure `state -\u003e DOM` rendering; handlers injected. Reads domain constants; no store access. |\n| `src/app.js` | Composition root: bootstraps i18n, composes controllers, subscribes store to renderer. |\n| `src/ui-prefs.js` | UI flag persistence (banners, visit marker, locale suggest dismiss). |\n| `src/solve-controller.js` | Solve session, walkthrough, share/hash banners, solve coachmark deferral. |\n| `src/lock-controller.js` | Lock mutation handlers; invalidates solve session on change. |\n| `src/locale-chrome-controller.js` | Locale suggest, i18n banner, geo hint, footer/header chrome. |\n| `src/app-renderer.js` | Lock panel render loop (controls, tumblers, solve button, solution area). |\n| `src/analytics/` | Product analytics facade; PostHog wired only in `transport.js`, init in `index.html`. |\n| `src/version.js` | Release version and changelog URL for the footer badge. |\n| `index.html`, `styles.css` | Shell and theme. |\n\n## Analytics\n\nProduction builds send **anonymous** usage data to [PostHog EU](https://eu.posthog.com) (hosted in the EU). We do not collect accounts, names, or personal information. Autocapture covers pageviews and clicks; custom events cover landing type, mapping milestones, solve funnel (with `solve_source`), walkthrough interaction, tutor/onboarding, share prompts, guide opens, lock wipe, and i18n (`locale_resolved`, `locale_changed`, `locale_session_end`, `i18n_banner_shown`, `locale_suggest_shown` / `locale_suggest_accepted` / `locale_suggest_declined`, translation-feedback link clicks). Every session registers `initial_locale`, `locale`, and engagement flags after bootstrap. Use `locale_session_end` where `staying_on_translation = true` for users who kept a translation, or `reverted_to_default = true` / `locale_changed.change_direction = to_default` for switch-back-to-English. No lock couplings, pin positions, or URL hash are sent. Analytics is disabled on `localhost` and `127.0.0.1` during local development.\n\n## Deploy your own\n\n1. Push to `main`.\n2. **Settings → Pages → Build and deployment**: source **Deploy from a branch**,\n   branch **`main`**, folder **`/ (root)`**.\n3. Default URL: `https://\u003cyour-user\u003e.github.io/\u003crepo\u003e/`.\n4. Optional custom domain: add a root `CNAME` file, set **Custom domain** in Pages\n   settings, and point DNS (A records to GitHub Pages IPs for apex, CNAME `www` to\n   `\u003cuser\u003e.github.io`). Live site: [gothiclockbreaker.com](https://gothiclockbreaker.com/).\n\n## License\n\nMIT — see [LICENSE](LICENSE). Copyright (c) 2026 Stanislav Stepanenko (Dsazz).\n\n## Credits\n\nA fan-made helper for the [Gothic 1 Remake](https://gothicremake.com/) by Alkimia\nInteractive. Not affiliated with or endorsed by the developers or publisher. All\nartwork here is original and themed, not taken from the game.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdsazz%2Fgothic-remake-lockbreaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdsazz%2Fgothic-remake-lockbreaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdsazz%2Fgothic-remake-lockbreaker/lists"}