Sensei Sandy Open Mat Ecosystem
Digital Dojo Blueprint

The Sensei Sandy "Open Mat" Ecosystem

Graph-powered training, algorithmic drills, embeddable glossary cards, and media refinement for the modern mat.

Every external mention becomes a backlink, every technique turns kinetic, and every visitor feels the gravity of a living syllabus.

Graph, drill, embed, refine - repeat.

Technique Topology (Graph Visualization)

Text lists are linear; Jiu-Jitsu is spherical. Cytoscape.js renders the glossary as nodes and transitions so users can feel the relationships.

  • Nodes: Sized by importance, color-coded by position (Guard = Blue, Mount = Red, etc.).
  • Edges: Arrows for transitions, dashed for counters, solid for dominant sequences.
  • Interaction: Node click recenters + highlights parents/children with all other elements fading.

Include a "Constellation Mode" toggle that switches between fully opaque graphs and a filtered parent/child view.

cy = cytoscape({
  container: document.getElementById('tech-topology'),
  elements: glossaryData,
  style: [
    { selector: 'node[type="Position"]', style: { 'background-color': '#3b82f6', 'label': 'data(term)' } },
    { selector: 'node[type="Submission"]', style: { 'background-color': '#ef4444' } },
    { selector: 'edge[type="Counter"]', style: { 'line-color': '#f59e0b', 'line-style': 'dashed', 'target-arrow-shape': 'triangle' } }
  ],
  layout: { name: 'preset', animate: true }
});
cy.on('tap', 'node', (evt) => {
  const node = evt.target;
  cy.elements().addClass('faded');
  node.closedNeighborhood().removeClass('faded');
  node.closedNeighborhood().layout({ name: 'cose' }).run();
});

Load Cytoscape from https://unpkg.com/cytoscape@latest/dist/cytoscape.min.js and hydrate glossaryData from JSON 4.0.

Infinite Kumite (Drill Mode)

Algorithmic coach random walks your connections array to keep your learners sharp.

Example: Closed Guard → Scissor Sweep → Mount → Cross Collar Choke.

Filters: No-Gi • Starting at Butterfly Guard.

Loading drill chain…

function randomCombo(startId, depth = 3, visited = new Set()) {
  if (depth === 0) return [startId];
  const node = glossaryIndex[startId];
  if (!node) return [startId];
  const children = node.connections.children || [];
  const chance = node.drill_logic.success_rate === 'high' ? 3 : 1;
  const pool = [].concat(...Array(chance).fill(children));
  const nextId = sample(pool.filter((id) => !visited.has(id)));
  if (!nextId) return [startId];
  visited.add(nextId);
  return [startId, ...randomCombo(nextId, depth - 1, visited)];
}

Use meta filters (gi/No-Gi, rank, counter priority) before running the random walk, then render the resulting chain into micro-copy like Drill Chain: Closed Guard → Scissor Sweep → Mount → Cross Collar Choke.

Sensei Card Protocol (Embeds)

Embed Sensei Sandy definitions anywhere with a minimalist route at https://senseisandy.com/embed/{term}. No navbars. No footers. Only the story, the video loop, and a backlink.

Allow CORS for that route and always include a branded watermark button.

<!doctype html>
<html lang="en">
<body>
  <main>
    <h1>Armbar</h1>
    <p>Classic submission from guard...</p>
    <video autoplay loop muted playsinline>
      <source src="https://senseisandy.com/assets/videos/armbar-loop.webm" type="video/webm">
    </video>
    <a href="https://senseisandy.com/glossary/armbar" class="btn btn-outline-light btn-sm">
      Learn more at Sensei Sandy
      <i class="bi bi-arrow-right"></i>
    </a>
  </main>
</body>
</html>

Ensure the embed route adds the Access-Control-Allow-Origin header for partner sites only. The iframe snippet to share is the one you provided.

Media Refinery (FFmpeg Script)

Automate format, size, and poster generation to serve lightweight WebM loops for your embed cards.

#!/bin/bash
for file in *.mp4; do
  filename="${file%.*}"
  ffmpeg -i "$file" -c:v libvpx-vp9 -b:v 0 -crf 30 -an \
    -vf "scale=720:-2" -deadline best \
    "${filename}_optimized.webm"
  ffmpeg -i "$file" -vframes 1 -q:v 2 \
    -vf "scale=720:-2" \
    "${filename}_poster.webp"
done

Strip audio, normalize width, and generate WebP posters for quick-loading playlists. Store the assets alongside glossary entries so embed cards can pull them dynamically.

JSON 4.0: Deep Schema for the Dojo

Every technique entry needs graph coordinates, connection arrays, drill metadata, and success cues for the random walk.

{
  "id": "scissor-sweep",
  "term": "Scissor Sweep",
  "aliases": ["Kani Basami (Sweep var.)"],
  "meta": { "rank": "White", "gi": true, "ibjjf_legal": true },
  "graph_coords": { "x": 100, "y": 200 },
  "connections": {
    "parents": ["closed-guard"],
    "children": ["mount", "side-control"],
    "counters": ["bullfighter-pass"]
  },
  "drill_logic": {
    "success_rate": "high",
    "combo_starter": false
  }
}

Use graph_coords for layout presets, connections to seed Cytoscape and the random walk, and drill_logic to bias combo probability. Keep glossaryData synced across every consumer page.

Actionable Summary

  • 1. Run the provided FFmpeg script to generate WebM loops + WebP posters for every technique video.
  • 2. Install Cytoscape.js, hydrate glossaryData, and honor parent/child focus on node clicks.
  • 3. Build /embed/{term} cards with CORS headers and the branded CTA to funnel link traffic back.
  • 4. Implement the Random Walk drill generator with filters and the “Spin the Wheel” trigger.
  • 5. Refine the AST parser that auto-links glossary terms so it skips existing <a> tags and guards against nested anchors.

This ecosystem turns static glossary content into an immersive, kinetic learning network with backlinks, embeds, and drills.

Train this in class: see the BJJ schedule in Tannersville, the Tannersville Jiu Jitsu hub, and the Catskills Jiu Jitsu regional page.

Need a diagnostic?

Ping ops for API keys, JSON export, and new embed-friendly media.