Skip to content

DirectorySkills

Clickable service map: 768, made in this run
Run 1Clickable service map“Make an interactive diagram of our school's IT systems and how they connect. Details in brief.md.”
Runs in
  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI
  • GitHub Copilot
  • OpenCode
Generates with
Your agent's model
Tested with
Claude Code 2.1.322Claude Sonnet 5.51 real run, 10 Nov
Needs
Node 20+Chrome
Licence
Recaply licence

Clickable Service Map

A clickable map of a product's services in layers, with live-style status, lit connections and a details panel.

$9.99once, yours to keep

Builds an interactive system (architecture) map into your own project: five columns (Clients, Edge, Services, Data, Outside) of service tiles on a dark blueprint grid, joined by curved lines; each tile shows a status word and dot; choosing a tile lights its lines and neighbours and opens a panel with owner, uptime, response time, what it depends on and what uses it; on phones the map becomes a grouped list. Plain HTML, CSS and JavaScript, or matched to React, Next.js, Vue, Svelte, Astro or Tailwind when the project uses them. Comes with a working reference and a check that screenshots it at phone, tablet and desktop widths and flags sideways overflow, text under 12px, missing alt text and names, low contrast, no focus styles, motion that ignores reduced motion, leftover sample words and emoji icons. Use when an engineering team, status page, developer docs or internal portal needs to show how services connect and how they are doing, or someone asks for an architecture diagram, service map or dependency map.

By RecaplyUpdated 12 Nov

Install Clickable Service Map

After the download, ask your agent to add it, or run the line yourself.

Read https://recaply.co/skills/clickable-service-map/install.md and follow it to install the clickable-service-map skill from clickable-service-map.zip.

Paste it into your agent. It reads our install steps, finds the ZIP you downloaded and adds the skill for you.

New to skills? How to install a skill

Similar skills

All 735 skills

Who Clickable Service Map is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • An interactive system (architecture) map
  • Checked at phone and desktop widths

Good fit

  • When an engineering team, status page, developer docs or internal portal needs to show how services connect and how they are doing

Not for

  • An app with a backend, sign-in or a database
  • Copying another company's site

About this skill

You say

Make an interactive diagram of our school's IT systems and how they connect. Details in brief.md.

It said back

I've built the Oakfield Academy IT map as a standalone page. The automated check passes at phone, tablet and desktop widths: no sideways overflow, no tiny text, and focus, contrast and reduced-motion rules all hold. I looked at the desktop and phone screenshots and they read cleanly. I didn't view the tablet one or click through the tiles in a browser.

It has four columns: People (staff, pupils, parents), Apps (learning platform, parent app, timetable), Core (sign-in, student records, file storage) and Suppliers (email, payments for trips). Timetable shows amber "Slow" and everything else is green "Healthy". Choosing a tile lights its lines and opens a panel with owner, status, what it depends on and what uses it. On phones it becomes a grouped list with each tile's links written out.

Show more

What it did in run 1

  1. clickable-service-map
  2. ./brief.md
  3. cd .; ls -a . .claude/skills/clickable-service-map/reference; wc -c .claude/skills/clickable-service-map/reference/*; cat .claude/skills/clickable-service-map/reference/index.html .claude/skills/clickable-service-map/reference/script.js
  4. cd ./.claude/skills/clickable-service-map/reference; cat style.css
  5. cd . R=.claude/skills/clickable-service-map/reference mkdir -p /tmp/gen && cat > /tmp/gen/gen.mjs <<'EOF' import fs from 'node:fs'; const [,, R, OUT] = process.argv; const cols = [ ['People',[['staff','Staff','ok','Not applicable'],['pupils','Pupils','ok','Not applicable'],['parents','Parents','ok','Not applicable']]], ['Apps',[['learn','Learning platform','ok','IT team'],['papp','Parent app','ok','IT team'],['time','Timetable','slow','Office']]], ['Core',[['sign','Sign-in','ok','IT team'],['rec','Student records','ok','Office'],['files','File storage','ok','IT team']]], ['Suppliers',[['mail','Email','ok','Supplier'],['pay','Payments for trips','ok','Supplier']]]]; const E=[['staff','learn'],['staff','time'],['pupils','learn'],['pupils','time'],['parents','papp'],['learn','sign'],['learn','rec'],['learn','files'],['time','sign'],['time','rec'],['papp','sign'],['papp','rec'],['papp','pay'],['papp','mail']]; const name={},st={},own={}; cols.forEach(c=>c[1].forEach(t=>{name[t[0]]=t[1];st[t[0]]=t[2];own[t[0]]=t[3];})); const S={ok:'Healthy',slow:'Slow'}; const uses=k=>E.filter(e=>e[0]===k).map(e=>name[e[1]]); const tile=t=><li><button type="button" class="sy-t ${t[2]}" data-k="${t[0]}" aria-pressed="false"><b>${t[1]}</b><span>${S[t[2]]}</span><span class="sy-links">${uses(t[0]).length?'Uses: '+uses(t[0]).join(', '):'Uses: nothing else here'}</span></button></li>; const colsH=cols.map(c=><div class="sy-col"><p class="sy-ln">${c[0]}</p><ul>${c[1].map(tile).join('')}</ul></div>).join(''); const data=JSON.stringify({E,OWN:own,name,st}); let h=fs.readFileSync(R+'/index.html','utf8'); const head=h.slice(0,h.indexOf('<main')); const html=head.replace('Clickable service map','Oakfield Academy IT systems map').replace(/<meta name="description"[^>]*>/,'<meta name="description" content="An interactive map of Oakfield Academy\'s IT systems, how they connect and how they are doing today.">')+ <main id="main"> <section class="p-sec sy" id="systems" aria-labelledby="systems-h"><div class="sec-head"><h2 id="systems-h">How Oakfield Academy <em>IT</em> fits together</h2><p class="sub">The systems staff, pupils and parents rely on, how they connect and how they are doing today.</p></div><div class="wrap"><div class="sy-top"><p class="sy-key"><span class="ok">Healthy</span><span class="slow">Slow</span><span class="down">Down</span></p><p class="sy-hint">Choose a system to see what it depends on and what uses it.</p></div><div class="sy-in"><div class="sy-map"><svg class="sy-lines" aria-hidden="true" focusable="false"></svg>${colsH}</div><aside class="sy-panel" aria-live="polite" data-panel><p class="sy-k">Overview</p><h3>8 systems, 1 slow</h3><p>The timetable is slow today. Everything else is healthy. Choose a system for details.</p></aside></div><script type="application/json" id="sy-data">${data}</script></div></section> </main> <script src="script.js" defer></script> </body> </html> ; fs.writeFileSync(OUT+'/index.html',html); EOF node /tmp/gen/gen.mjs $R . sed -e 's/repeat(5,1fr)/repeat(4,1fr)/' $R/style.css | sed "s/^\.sy-t b{/.sy-t b{font-family:'JetBrains Mono',monospace;font-weight:600;/" > style.css python3 - <<'EOF' s=open('.claude/skills/clickable-service-map/reference/script.js').read() i=s.index('// this design') s=s[i:] s=s.replace("<dt>Uptime, 30 days</dt><dd>' + inf[1] + '</dd><dt>Typical response</dt><dd>' + inf[2] + '</dd>","<dt>Status</dt><dd>' + ST[SY.st[k]] + '</dd>") s=s.replace("const inf = SY.INFO[k]","const inf = [SY.OWN[k]]") s=s.replace("Nothing inside the shop","Nothing else on this map").replace("Customers directly","Nobody else on this map") s=s.replace("if (!sel) return;","if (!sel) { panel.innerHTML = OVERVIEW; return; }") s=s.replace("const panel = document.querySelector('[data-panel]');","const panel = document.querySelector('[data-panel]'); const OVERVIEW = panel.innerHTML;") s="document.documentElement.classList.add('js');\n"+s open('script.js','w').write(s) EOF grep -c "OVERVIEW" script.js node .claude/skills/clickable-service-map/scripts/check.mjs index.html --out check 2>&1 | tail -30
  6. cd . R=.claude/skills/clickable-service-map/reference mkdir -p /tmp/gen && ls /tmp/gen; ls
  7. ./index.html
  8. cd . && python3 - <<'EOF' R='.claude/skills/clickable-service-map/reference/' c=open(R+'style.css').read().replace('repeat(5,1fr)','repeat(4,1fr)').replace('.sy-t b{','.sy-t b{font-family:"JetBrains Mono",monospace;font-weight:600;') open('style.css','w').write(c) s=open(R+'script.js').read() s=s[s.index('// this design'):] s=s.replace("<dt>Uptime, 30 days</dt><dd>' + inf[1] + '</dd><dt>Typical response</dt><dd>' + inf[2] + '</dd>","<dt>Status</dt><dd>' + ST[SY.st[k]] + '</dd>") s=s.replace("const inf = SY.INFO[k]","const inf = [SY.OWN[k]]") s=s.replace("Nothing inside the shop","Nothing else on this map").replace("Customers directly","Nobody else on this map") s=s.replace("if (!sel) return;","if (!sel) { panel.innerHTML = OVERVIEW; return; }") s=s.replace("const panel = document.querySelector('[data-panel]');","const panel = document.querySelector('[data-panel]'); const OVERVIEW = panel.innerHTML;") open('script.js','w').write("document.documentElement.classList.add('js');\n"+s) EOF node .claude/skills/clickable-service-map/scripts/check.mjs index.html --out check 2>&1 | tail -25
  9. ./script.js
  10. ./style.css
  11. node .claude/skills/clickable-service-map/scripts/check.mjs index.html --out check
  12. W=.; node $W/.claude/skills/clickable-service-map/scripts/check.mjs $W/index.html --out $W/check 2>&1 | tail -30
  13. node ./.claude/skills/clickable-service-map/scripts/check.mjs ./index.html --out ./check 2>&1 | tail -30
  14. ./check/1440.png
  15. ./check/390.png
  16. Done

10 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 1 min 33 s · $0.30 of API use

Questions

Is Clickable Service Map free?

No. Clickable Service Map costs $9.99 once and stays in your Recaply account, or it comes with the Recaply plan ($19.99 a month), which opens every premium skill and prompt.

Which agents can use Clickable Service Map?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.

What do I get when I buy Clickable Service Map?

A ZIP of the whole skill folder (33 KB): the SKILL.md your agent follows and its 6 other files, the references, templates and scripts it uses. You download it from this page whenever you need it, and install it in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. The Recaply plan opens it too, with every other premium skill and prompt.

How do I install Clickable Service Map?

Buy it, then download the ZIP from this page. For Claude Code, unzip it into .claude/skills/ in your project. For Codex, Cursor and Gemini CLI, unzip it and run npx skills add ./clickable-service-map with your agent's flag.

What do I get from Clickable Service Map?

One HTML file with its CSS inside: no build step, no framework. An interactive system (architecture) map. Checked at phone and desktop widths.

What does Clickable Service Map need?

Node 20+ and Chrome, and no API key. Each use costs nothing beyond your agent.

How big is Clickable Service Map?

7 files, about 21,643 tokens in all. The SKILL.md is about 2,178 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 1 min 33 s to 1 min 33 s and $0.30 to $0.30 of API use each, in Claude Code with claude-sonnet-5-5. On a Claude plan, a run counts toward your usage instead.

Do I have to name Clickable Service Map to use it?

Type /clickable-service-map first to make sure it loads. Without it, Claude Code may judge a small job simple enough to do without the skill.