CyberMax-tools commited on
Commit
666e616
·
verified ·
1 Parent(s): 1a9696c

Deploy pathmoor

Browse files
Files changed (7) hide show
  1. README.md +3 -11
  2. cmx.js +2 -2
  3. fun.css +1 -0
  4. funpass.js +41 -8
  5. game.js +2 -1
  6. index.html +11 -11
  7. sw.js +1 -1
README.md CHANGED
@@ -16,19 +16,11 @@ tags:
16
  - browser-game
17
  - pwa
18
  - cybermax
19
- thumbnail: https://huggingface.co/spaces/CyberMax-tools/pathmoor/resolve/main/thumbnail.png
20
  ---
21
-
22
- <!-- cm:demo -->
23
- <video src="https://cybermax.cybermax-tools.workers.dev/media/demos/pathmoor/demo-16x9.mp4" poster="https://cybermax.cybermax-tools.workers.dev/media/demos/pathmoor/poster.jpg" controls muted loop playsinline width="100%"></video>
24
-
25
- ▶ **[Watch the 9-second demo](https://cybermax.cybermax-tools.workers.dev/media/demos/pathmoor/demo-16x9.mp4)**: the live Pathmoor page with a real result, no voice. **[Try it / get it](https://cybermax.cybermax-tools.workers.dev/games/pathmoor/?utm_source=huggingface&utm_medium=readme&utm_campaign=demo-video)**
26
- <!-- /cm:demo -->
27
-
28
  **Pathmoor**: Daily path puzzle: turn stones until every path glows. A free daily game from CyberMax: the same challenge for everyone each day, a shareable result, works offline and installs on your phone (no app store, no sign-up).
29
 
30
- Play it full screen: https://cybermax.cybermax-tools.workers.dev/games/pathmoor/?utm_source=huggingface
31
 
32
- The optional **CyberMax Fun Pass** ($2.99/month, $19/year or $4.99 once) adds extra packs, the full archive of past dailies and colour themes in every CyberMax game: https://cybermax.cybermax-tools.workers.dev/games/?utm_source=huggingface
33
 
34
- More free games: https://cybermax.cybermax-tools.workers.dev/games/ · © 2026 CyberMax. All rights reserved.
 
16
  - browser-game
17
  - pwa
18
  - cybermax
 
19
  ---
 
 
 
 
 
 
 
20
  **Pathmoor**: Daily path puzzle: turn stones until every path glows. A free daily game from CyberMax: the same challenge for everyone each day, a shareable result, works offline and installs on your phone (no app store, no sign-up).
21
 
22
+ Play it full screen: https://cybermaxtools.com/games/pathmoor/?utm_source=huggingface
23
 
24
+ The optional **CyberMax Fun Pass** ($2.99/month, $19/year or $4.99 once) adds extra packs, the full archive of past dailies and colour themes in every CyberMax game: https://cybermaxtools.com/games/?utm_source=huggingface
25
 
26
+ More free games: https://cybermaxtools.com/games/ · © 2026 CyberMax. All rights reserved.
cmx.js CHANGED
@@ -3,8 +3,8 @@
3
  // Counter beacon (game + event + channel only: no cookies, no IDs, nothing personal), daily seed, share, PWA install.
4
  // (c) 2026 CyberMax. All rights reserved.
5
 
6
- export const SITE = 'https://cybermax.cybermax-tools.workers.dev';
7
- export const API = 'https://toys.cybermax-tools.workers.dev';
8
  export const EPOCH = Date.UTC(2026, 9, 2); // 2 Oct 2026 = puzzle #1 for every CyberMax daily game
9
 
10
  /** Today's date in the player's own time zone as YYYY-MM-DD (everyone gets a new puzzle at their local midnight). */
 
3
  // Counter beacon (game + event + channel only: no cookies, no IDs, nothing personal), daily seed, share, PWA install.
4
  // (c) 2026 CyberMax. All rights reserved.
5
 
6
+ export const SITE = 'https://cybermaxtools.com';
7
+ export const API = 'https://toys.cybermaxtools.com';
8
  export const EPOCH = Date.UTC(2026, 9, 2); // 2 Oct 2026 = puzzle #1 for every CyberMax daily game
9
 
10
  /** Today's date in the player's own time zone as YYYY-MM-DD (everyone gets a new puzzle at their local midnight). */
fun.css CHANGED
@@ -49,3 +49,4 @@ dialog.funpass::backdrop{background:rgba(10,12,18,.55)}
49
  @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
50
  @media (max-width:560px){.chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -16px;padding:2px 16px 4px}.chips::-webkit-scrollbar{display:none}.chip{flex:0 0 auto}}
51
  @media (min-width:760px){dialog.funpass{max-width:720px}.fp-perks{columns:2;column-gap:28px}}
 
 
49
  @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
50
  @media (max-width:560px){.chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -16px;padding:2px 16px 4px}.chips::-webkit-scrollbar{display:none}.chip{flex:0 0 auto}}
51
  @media (min-width:760px){dialog.funpass{max-width:720px}.fp-perks{columns:2;column-gap:28px}}
52
+ .fp-after{margin:14px 0 0;padding:12px 14px;border:1px solid var(--line, rgba(127,127,127,.35));border-radius:14px;text-align:left}.fp-after p{margin:0 0 8px}.fp-after .fp-row{display:flex;gap:8px;flex-wrap:wrap}
funpass.js CHANGED
@@ -1,21 +1,21 @@
1
  // CyberMax Fun Pass: ONE optional supporter pass for every CyberMax game (copied into each game's web/ folder).
2
  // Free games stay free. The pass removes the supporter nudges and unlocks extra packs, the full archive and themes.
3
- // Monthly $2.99 · Yearly $19 · Unlock all $4.99 once (Stripe Payment Links, pack revenue/packs/stripe/fun-pass).
4
- // Buy: counted redirect https://data.cybermax-tools.workers.dev/buy/st-fun-pass-<plan>?s=game-<id> -> Stripe checkout.
5
- // After checkout Stripe sends the buyer to data.cybermax-tools.workers.dev/unlock/fun-pass?session_id=..., which checks
6
  // the Checkout Session (and, for a subscription, that it is still active) and returns to /games/ with #cmx-pro=<code>.
7
  // Every game on the same site reads the same browser key, so one pass covers them all. The code on the receipt page
8
  // unlocks any other device or browser. No account, no cookies, nothing personal stored. (c) 2026 CyberMax.
9
  import { count, store, toast } from './cmx.js';
10
 
11
- const DATA = 'https://data.cybermax-tools.workers.dev';
12
  const KEY = 'cmx-pro:fun-pass';
13
- const SID = /^cs_(live|test)_[A-Za-z0-9]{10,200}$/;
14
  const RECHECK = 3 * 864e5; // subscriptions are re-checked every 3 days; a cancelled pass turns off by itself
15
  export const PLANS = [
16
  { id: 'monthly', label: 'Monthly', price: '$2.99', per: '/month', note: 'Cancel any time' },
17
  { id: 'yearly', label: 'Yearly', price: '$19', per: '/year', note: 'Save 47%', best: true },
18
- { id: 'unlock', label: 'Unlock all', price: '$4.99', per: ' once', note: 'Pay once, keep forever' },
19
  ];
20
  export const COMMON_PERKS = ['No supporter nudges, ever', 'Extra puzzle packs in every game', 'The full archive of past dailies', 'Custom colour themes'];
21
 
@@ -88,11 +88,11 @@ function render() {
88
  <ul class="fp-perks">${perks.map((p) => `<li>${esc(p)}</li>`).join('')}</ul>
89
  <div class="fp-plans">${PLANS.map((p) => `<a class="fp-plan${p.best ? ' best' : ''}" href="${buyUrl(p.id)}" rel="nofollow" data-plan="${p.id}">${p.best ? '<i>Best value</i>' : ''}<b>${p.label}</b><span class="fp-price">${p.price}<small>${p.per}</small></span><span class="fp-note">${p.note}</span></a>`).join('')}</div>
90
  <p class="fp-small">Secure Stripe checkout. Works in every CyberMax game. The free daily games stay free for everyone.</p>
91
- <details><summary>Already have a pass?</summary><form class="fp-form"><input aria-label="Pass code" autocomplete="off" placeholder="Code from your receipt page (cs_live_…)"><button class="btn sm" type="submit">Turn on</button></form></details></div>`;
92
  d.querySelector('.fp-form').addEventListener('submit', (e) => {
93
  e.preventDefault();
94
  const c = e.target.querySelector('input').value.trim();
95
- if (SID.test(c)) unlock(c); else toast('Paste the code from your receipt page. It starts with cs_live_.', 3500);
96
  });
97
  d.querySelectorAll('[data-plan]').forEach((a) => a.addEventListener('click', () => count(cfg.game, 'cta', `pass-${a.dataset.plan}`)));
98
  }
@@ -105,6 +105,39 @@ export function open(from = 'button') {
105
  count(cfg.game, 'cta', `pass-open-${from}`);
106
  }
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  /** Call once per page: game id, display name and the game's own Pro perks (listed first). */
109
  export function init(options) {
110
  cfg = { ...cfg, ...options };
 
1
  // CyberMax Fun Pass: ONE optional supporter pass for every CyberMax game (copied into each game's web/ folder).
2
  // Free games stay free. The pass removes the supporter nudges and unlocks extra packs, the full archive and themes.
3
+ // Monthly $2.99 · Yearly $19 · Lifetime $29.99 once (Stripe Payment Links, pack revenue/packs/stripe/fun-pass).
4
+ // Buy: counted redirect https://data.cybermaxtools.com/buy/st-fun-pass-<plan>?s=game-<id> -> Stripe checkout.
5
+ // After checkout Stripe sends the buyer to data.cybermaxtools.com/unlock/fun-pass?session_id=..., which checks
6
  // the Checkout Session (and, for a subscription, that it is still active) and returns to /games/ with #cmx-pro=<code>.
7
  // Every game on the same site reads the same browser key, so one pass covers them all. The code on the receipt page
8
  // unlocks any other device or browser. No account, no cookies, nothing personal stored. (c) 2026 CyberMax.
9
  import { count, store, toast } from './cmx.js';
10
 
11
+ const DATA = 'https://data.cybermaxtools.com';
12
  const KEY = 'cmx-pro:fun-pass';
13
+ const SID = /^(cs_(live|test)_[A-Za-z0-9]{10,200}|[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8})$/i; // Stripe order code or Gumroad licence key
14
  const RECHECK = 3 * 864e5; // subscriptions are re-checked every 3 days; a cancelled pass turns off by itself
15
  export const PLANS = [
16
  { id: 'monthly', label: 'Monthly', price: '$2.99', per: '/month', note: 'Cancel any time' },
17
  { id: 'yearly', label: 'Yearly', price: '$19', per: '/year', note: 'Save 47%', best: true },
18
+ { id: 'unlock', label: 'Lifetime', price: '$29.99', per: ' once', note: 'Pay once, keep forever' },
19
  ];
20
  export const COMMON_PERKS = ['No supporter nudges, ever', 'Extra puzzle packs in every game', 'The full archive of past dailies', 'Custom colour themes'];
21
 
 
88
  <ul class="fp-perks">${perks.map((p) => `<li>${esc(p)}</li>`).join('')}</ul>
89
  <div class="fp-plans">${PLANS.map((p) => `<a class="fp-plan${p.best ? ' best' : ''}" href="${buyUrl(p.id)}" rel="nofollow" data-plan="${p.id}">${p.best ? '<i>Best value</i>' : ''}<b>${p.label}</b><span class="fp-price">${p.price}<small>${p.per}</small></span><span class="fp-note">${p.note}</span></a>`).join('')}</div>
90
  <p class="fp-small">Secure Stripe checkout. Works in every CyberMax game. The free daily games stay free for everyone.</p>
91
+ <details><summary>Already have a pass?</summary><form class="fp-form"><input aria-label="Pass code" autocomplete="off" placeholder="Receipt code (cs_live_…) or Gumroad licence key"><button class="btn sm" type="submit">Turn on</button></form></details></div>`;
92
  d.querySelector('.fp-form').addEventListener('submit', (e) => {
93
  e.preventDefault();
94
  const c = e.target.querySelector('input').value.trim();
95
+ if (SID.test(c)) unlock(c); else toast('Paste the code from your receipt page (cs_live_…) or your Gumroad licence key.', 3500);
96
  });
97
  d.querySelectorAll('[data-plan]').forEach((a) => a.addEventListener('click', () => count(cfg.game, 'cta', `pass-${a.dataset.plan}`)));
98
  }
 
105
  count(cfg.game, 'cta', `pass-open-${from}`);
106
  }
107
 
108
+ /** After a finished round (the value moment): one small inline card under the result, never a pop-up. Shows the
109
+ * pass price, the honest trust line and an optional "email me" weekly reminder (double opt-in).
110
+ * `host` is the result panel; the card is added once and removed for pass holders. */
111
+ export function afterWin(host, from = 'win') {
112
+ if (!host) return;
113
+ if (isPro()) { host.querySelector('.fp-after')?.remove(); return; }
114
+ let el = host.querySelector('.fp-after');
115
+ if (!el) { el = document.createElement('div'); el.className = 'fp-after'; host.appendChild(el); }
116
+ const best = PLANS.find((p) => p.best) || PLANS[0];
117
+ el.innerHTML = `<p><b>Want more today?</b> ${esc(cfg.extra || 'The Fun Pass unlocks extra packs, the full archive and themes in every CyberMax game.')}</p>
118
+ <p class="fp-row"><a class="btn sm" href="${buyUrl(best.id)}-after" rel="nofollow" data-after>Get the Fun Pass: ${esc(best.price)}${esc(best.per)}</a> <button class="btn sm ghost" type="button" data-plans>See all plans</button></p>
119
+ <p class="fp-small">Secure Stripe checkout · the pass turns on as soon as you pay · cancel any time from your receipt email · 14-day promise: if it doesn't work as described, we fix it or refund you (<a href="https://cybermaxtools.com/terms#payments" target="_blank" rel="noopener">terms</a>). Today's free game stays free.</p>
120
+ <div class="fp-cap"></div>`;
121
+ el.querySelector('[data-after]').addEventListener('click', () => { count(cfg.game, 'cta', `pass-${best.id}-after`); kit((K) => K.event('upgrade-click', cfg.game)); });
122
+ el.querySelector('[data-plans]').addEventListener('click', () => open(`after-${from}`));
123
+ kit((K) => {
124
+ K.event('result', cfg.game); K.event('upgrade-view', cfg.game);
125
+ K.capture(el.querySelector('.fp-cap'), { list: `weekly-${cfg.game}`, src: `game-${cfg.game}`, label: cfg.remind || 'Email me a weekly reminder with new puzzles (free)', button: 'Remind me' });
126
+ });
127
+ }
128
+
129
+ // Convert kit (funnel beacons + email capture) from the CyberMax site; optional, the game works without it.
130
+ let kitQ = null;
131
+ function kit(fn) {
132
+ if (window.CMXConvert) return fn(window.CMXConvert);
133
+ if (kitQ) return kitQ.push(fn);
134
+ kitQ = [fn];
135
+ const sc = document.createElement('script');
136
+ sc.src = 'https://cybermaxtools.com/store/convert.js'; sc.async = true;
137
+ sc.onload = () => kitQ.splice(0).forEach((f) => { try { f(window.CMXConvert); } catch { /* optional */ } });
138
+ document.head.appendChild(sc);
139
+ }
140
+
141
  /** Call once per page: game id, display name and the game's own Pro perks (listed first). */
142
  export function init(options) {
143
  cfg = { ...cfg, ...options };
game.js CHANGED
@@ -191,6 +191,7 @@ function showWin(scroll) {
191
  pr.textContent = mode.level < pk.levels ? `Next board: ${pk.name} #${mode.level + 1}` : 'Pack complete! Try another pack';
192
  } else pr.textContent = 'Play a practice board';
193
  $('win').hidden = false;
 
194
  tick();
195
  if (scroll) $('win').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
196
  }
@@ -274,7 +275,7 @@ function card() {
274
  g.font = '700 44px system-ui, sans-serif'; g.fillStyle = S.on;
275
  g.fillText(`${totalTaps()} taps · par ${par(board)}`, 80, 1235);
276
  g.fillStyle = '#ffffffaa'; g.font = '600 32px system-ui, sans-serif';
277
- g.fillText('Play free: cybermax.cybermax-tools.workers.dev/games/pathmoor', 80, 1300);
278
  return c;
279
  }
280
 
 
191
  pr.textContent = mode.level < pk.levels ? `Next board: ${pk.name} #${mode.level + 1}` : 'Pack complete! Try another pack';
192
  } else pr.textContent = 'Play a practice board';
193
  $('win').hidden = false;
194
+ pass.afterWin($('win'), 'win');
195
  tick();
196
  if (scroll) $('win').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
197
  }
 
275
  g.font = '700 44px system-ui, sans-serif'; g.fillStyle = S.on;
276
  g.fillText(`${totalTaps()} taps · par ${par(board)}`, 80, 1235);
277
  g.fillStyle = '#ffffffaa'; g.font = '600 32px system-ui, sans-serif';
278
+ g.fillText('Play free: cybermaxtools.com/games/pathmoor', 80, 1300);
279
  return c;
280
  }
281
 
index.html CHANGED
@@ -2,24 +2,24 @@
2
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
3
  <title>Pathmoor: free daily path puzzle. Light every stone | CyberMax</title>
4
  <meta name="description" content="Pathmoor is a free daily path puzzle: tap stones to turn them until every path glows from the lantern. A new board every day, about 2 minutes, share your time like Wordle. Works offline, installs on your phone.">
5
- <link rel="canonical" href="https://cybermax.cybermax-tools.workers.dev/games/pathmoor/">
6
  <meta property="og:type" content="website"><meta property="og:site_name" content="CyberMax">
7
  <meta property="og:title" content="Pathmoor: light every stone">
8
  <meta property="og:description" content="A new path puzzle every day. Tap to turn stones until every path glows. Share your time.">
9
- <meta property="og:url" content="https://cybermax.cybermax-tools.workers.dev/games/pathmoor/">
10
- <meta property="og:image" content="https://cybermax.cybermax-tools.workers.dev/games/pathmoor/og.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630">
11
- <meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="https://cybermax.cybermax-tools.workers.dev/games/pathmoor/og.png">
12
  <meta name="theme-color" content="#16241E">
13
  <link rel="manifest" href="manifest.webmanifest">
14
  <link rel="icon" href="icon.svg" type="image/svg+xml"><link rel="apple-touch-icon" href="icon-192.png">
15
  <meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="Pathmoor">
16
  <link rel="stylesheet" href="fun.css"><link rel="stylesheet" href="style.css">
17
  <script>try{var t=localStorage.getItem('cm-theme');if(t)document.documentElement.dataset.theme=t;var s=localStorage.getItem('pathmoor:skin');if(s)document.documentElement.dataset.skin=JSON.parse(s)}catch(e){}</script>
18
- <script type="application/ld+json">{"@context":"https://schema.org","@type":"VideoGame","name":"Pathmoor","url":"https://cybermax.cybermax-tools.workers.dev/games/pathmoor/","image":"https://cybermax.cybermax-tools.workers.dev/games/pathmoor/og.png","description":"A free daily path puzzle: tap stones to turn them until every path glows from the lantern.","genre":["Puzzle","Logic"],"gamePlatform":["Web browser","Android","iOS"],"applicationCategory":"Game","operatingSystem":"Any","playMode":"SinglePlayer","publisher":{"@type":"Organization","name":"CyberMax","url":"https://cybermax.cybermax-tools.workers.dev/"},"offers":[{"@type":"Offer","price":"0","priceCurrency":"USD","description":"Daily puzzle, free"},{"@type":"Offer","price":"2.99","priceCurrency":"USD","description":"CyberMax Fun Pass, monthly"}]}</script>
19
  </head><body>
20
  <div class="wrap">
21
- <header class="top"><a class="brand" href="https://cybermax.cybermax-tools.workers.dev/games/"><svg viewBox="0 0 512 512" aria-hidden="true"><clipPath id="lg"><rect width="512" height="512" rx="116"/></clipPath><g clip-path="url(#lg)"><rect width="512" height="512" fill="#FF6A3D"/><path d="M512 250V512H250Z" fill="#D9481F"/></g><g transform="translate(86 86) scale(3.4)"><path d="M66 27 A27 27 0 1 0 66 73" fill="none" stroke="#11141B" stroke-width="17" stroke-linecap="round"/><rect x="66" y="41" width="20" height="18" rx="4" fill="#11141B"/></g></svg>CyberMax</a>
22
- <nav><a href="https://cybermax.cybermax-tools.workers.dev/games/">Games</a></nav><button class="icon" id="stats-btn" type="button" aria-label="Your stats">📊</button><button class="icon" id="theme" type="button" aria-label="Switch light or dark">◐</button></header>
23
  <main>
24
  <section class="game">
25
  <div class="headline"><h1>Pathmoor <span id="num" class="num"></span> <span class="pro-badge">PASS</span></h1>
@@ -48,14 +48,14 @@
48
  <h3>A new board every day</h3>
49
  <p>Everyone gets the same daily board, and it changes at your midnight. Share your time and taps with the grid: 🟩 a stone you set in par, 🟨 a few extra turns, 🟧 a lot, ⬜ a stone that was already right. Keep your streak going. Pathmoor works offline and installs on your phone like an app (no app store, no sign-up).</p>
50
  <h3>Free, with an optional Fun Pass</h3>
51
- <p>The daily board and three practice boards are free for everyone. The optional <b>CyberMax Fun Pass</b> ($2.99/month, $19/year, or $4.99 once) adds the Moorland 7×7, Highland 8×8 and Summit 10×10 packs (250 boards), the full archive of past dailies and colour themes, removes the supporter nudges, and works in every CyberMax game.</p>
52
  <h3>FAQ</h3>
53
  <p><b>Is there only one solution?</b> Any arrangement that lights every stone with no loose ends counts. <b>Does it track me?</b> No accounts, no cookies; only anonymous counts (a game was played or shared). <b>Why not just play another daily puzzle?</b> Pathmoor is a turn-the-tiles puzzle you can finish on a coffee break, with a fresh board daily and a par score to beat.</p>
54
  <h2>More free games from CyberMax</h2>
55
- <div class="more" id="more"><a href="https://cybermax.cybermax-tools.workers.dev/games/whirlane/"><b>Whirlane</b><span>One-tap orbit dodger with a daily leaderboard</span></a><a href="https://cybermax.cybermax-tools.workers.dev/games/townduel/"><b>Townduel</b><span>Which US town costs more? 10 daily duels</span></a><a href="https://cybermax.cybermax-tools.workers.dev/toys/"><b>Web toys</b><span>Roast your website, vibe-check a name</span></a></div>
56
  </section>
57
  </main>
58
- <footer>© 2026 CyberMax · <a href="https://cybermax.cybermax-tools.workers.dev/games/">Games</a> · <a href="https://cybermax.cybermax-tools.workers.dev/toys/">Toys</a> · <a href="https://cybermax.cybermax-tools.workers.dev/store/">Store</a> · <a href="https://cybermax.cybermax-tools.workers.dev/privacy">Privacy</a> · <a href="https://cybermax.cybermax-tools.workers.dev/terms">Terms</a></footer>
59
  </div>
60
  <script type="module" src="game.js"></script>
61
- <!-- cybermax-count:start --><script>(function(){try{var u="https://data.cybermax-tools.workers.dev/v?p="+encodeURIComponent(location.host+location.pathname)+"&r="+encodeURIComponent((document.referrer||"").split("/")[2]||"")+(function(){var q=new URLSearchParams(location.search),s=q.get("utm_source");return s?"&us="+encodeURIComponent(s)+"&uc="+encodeURIComponent(q.get("utm_campaign")||""):""})();navigator.sendBeacon?navigator.sendBeacon(u):(new Image).src=u}catch(e){}})()</script><!-- cybermax-count:end --></body></html>
 
2
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
3
  <title>Pathmoor: free daily path puzzle. Light every stone | CyberMax</title>
4
  <meta name="description" content="Pathmoor is a free daily path puzzle: tap stones to turn them until every path glows from the lantern. A new board every day, about 2 minutes, share your time like Wordle. Works offline, installs on your phone.">
5
+ <link rel="canonical" href="https://cybermaxtools.com/games/pathmoor/">
6
  <meta property="og:type" content="website"><meta property="og:site_name" content="CyberMax">
7
  <meta property="og:title" content="Pathmoor: light every stone">
8
  <meta property="og:description" content="A new path puzzle every day. Tap to turn stones until every path glows. Share your time.">
9
+ <meta property="og:url" content="https://cybermaxtools.com/games/pathmoor/">
10
+ <meta property="og:image" content="https://cybermaxtools.com/games/pathmoor/og.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630">
11
+ <meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="https://cybermaxtools.com/games/pathmoor/og.png">
12
  <meta name="theme-color" content="#16241E">
13
  <link rel="manifest" href="manifest.webmanifest">
14
  <link rel="icon" href="icon.svg" type="image/svg+xml"><link rel="apple-touch-icon" href="icon-192.png">
15
  <meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="Pathmoor">
16
  <link rel="stylesheet" href="fun.css"><link rel="stylesheet" href="style.css">
17
  <script>try{var t=localStorage.getItem('cm-theme');if(t)document.documentElement.dataset.theme=t;var s=localStorage.getItem('pathmoor:skin');if(s)document.documentElement.dataset.skin=JSON.parse(s)}catch(e){}</script>
18
+ <script type="application/ld+json">{"@context":"https://schema.org","@type":"VideoGame","name":"Pathmoor","url":"https://cybermaxtools.com/games/pathmoor/","image":"https://cybermaxtools.com/games/pathmoor/og.png","description":"A free daily path puzzle: tap stones to turn them until every path glows from the lantern.","genre":["Puzzle","Logic"],"gamePlatform":["Web browser","Android","iOS"],"applicationCategory":"Game","operatingSystem":"Any","playMode":"SinglePlayer","publisher":{"@type":"Organization","name":"CyberMax","url":"https://cybermaxtools.com/"},"offers":[{"@type":"Offer","price":"0","priceCurrency":"USD","description":"Daily puzzle, free"},{"@type":"Offer","price":"2.99","priceCurrency":"USD","description":"CyberMax Fun Pass, monthly"}]}</script>
19
  </head><body>
20
  <div class="wrap">
21
+ <header class="top"><a class="brand" href="https://cybermaxtools.com/games/"><svg viewBox="0 0 512 512" aria-hidden="true"><clipPath id="lg"><rect width="512" height="512" rx="116"/></clipPath><g clip-path="url(#lg)"><rect width="512" height="512" fill="#FF6A3D"/><path d="M512 250V512H250Z" fill="#D9481F"/></g><g transform="translate(86 86) scale(3.4)"><path d="M66 27 A27 27 0 1 0 66 73" fill="none" stroke="#11141B" stroke-width="17" stroke-linecap="round"/><rect x="66" y="41" width="20" height="18" rx="4" fill="#11141B"/></g></svg>CyberMax</a>
22
+ <nav><a href="https://cybermaxtools.com/games/">Games</a></nav><button class="icon" id="stats-btn" type="button" aria-label="Your stats">📊</button><button class="icon" id="theme" type="button" aria-label="Switch light or dark">◐</button></header>
23
  <main>
24
  <section class="game">
25
  <div class="headline"><h1>Pathmoor <span id="num" class="num"></span> <span class="pro-badge">PASS</span></h1>
 
48
  <h3>A new board every day</h3>
49
  <p>Everyone gets the same daily board, and it changes at your midnight. Share your time and taps with the grid: 🟩 a stone you set in par, 🟨 a few extra turns, 🟧 a lot, ⬜ a stone that was already right. Keep your streak going. Pathmoor works offline and installs on your phone like an app (no app store, no sign-up).</p>
50
  <h3>Free, with an optional Fun Pass</h3>
51
+ <p>The daily board and three practice boards are free for everyone. The optional <b>CyberMax Fun Pass</b> ($2.99/month, $19/year, or $29.99 for life) adds the Moorland 7×7, Highland 8×8 and Summit 10×10 packs (250 boards), the full archive of past dailies and colour themes, removes the supporter nudges, and works in every CyberMax game.</p>
52
  <h3>FAQ</h3>
53
  <p><b>Is there only one solution?</b> Any arrangement that lights every stone with no loose ends counts. <b>Does it track me?</b> No accounts, no cookies; only anonymous counts (a game was played or shared). <b>Why not just play another daily puzzle?</b> Pathmoor is a turn-the-tiles puzzle you can finish on a coffee break, with a fresh board daily and a par score to beat.</p>
54
  <h2>More free games from CyberMax</h2>
55
+ <div class="more" id="more"><a href="https://cybermaxtools.com/games/whirlane/"><b>Whirlane</b><span>One-tap orbit dodger with a daily leaderboard</span></a><a href="https://cybermaxtools.com/games/townduel/"><b>Townduel</b><span>Which US town costs more? 10 daily duels</span></a><a href="https://cybermaxtools.com/toys/"><b>Web toys</b><span>Roast your website, vibe-check a name</span></a></div>
56
  </section>
57
  </main>
58
+ <footer>© 2026 CyberMax · <a href="https://cybermaxtools.com/games/">Games</a> · <a href="https://cybermaxtools.com/toys/">Toys</a> · <a href="https://cybermaxtools.com/store/">Store</a> · <a href="https://cybermaxtools.com/privacy">Privacy</a> · <a href="https://cybermaxtools.com/terms">Terms</a></footer>
59
  </div>
60
  <script type="module" src="game.js"></script>
61
+ </body></html>
sw.js CHANGED
@@ -1,7 +1,7 @@
1
  // CyberMax game service worker: the game works offline after the first visit. Cache-first for the game's own files,
2
  // network-first for the page itself (so updates arrive), never caches API calls or other sites. (c) 2026 CyberMax.
3
  const GAME = 'pathmoor';
4
- const CACHE = `cmx-${GAME}-ddcdf874da`;
5
  const FILES = ["index.html", "cmx.js", "core.js", "fun.css", "funpass.js", "game.js", "icon-192.png", "icon-512.png", "icon-maskable.png", "icon.svg", "index.html", "manifest.webmanifest", "style.css"];
6
 
7
  self.addEventListener('install', (e) => {
 
1
  // CyberMax game service worker: the game works offline after the first visit. Cache-first for the game's own files,
2
  // network-first for the page itself (so updates arrive), never caches API calls or other sites. (c) 2026 CyberMax.
3
  const GAME = 'pathmoor';
4
+ const CACHE = `cmx-${GAME}-4b226fa7a1`;
5
  const FILES = ["index.html", "cmx.js", "core.js", "fun.css", "funpass.js", "game.js", "icon-192.png", "icon-512.png", "icon-maskable.png", "icon.svg", "index.html", "manifest.webmanifest", "style.css"];
6
 
7
  self.addEventListener('install', (e) => {