Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Crawler Summary
This skill covers creating infinite tunnel effects using Three.js and GSAP --- name: infinite-tunnel description: This skill covers creating infinite tunnel effects using Three.js and GSAP --- Three.js Infinite Tunnel Effect Skill Overview This skill covers creating infinite tunnel effects using Three.js and GSAP (GreenSock Animation Platform). An infinite tunnel creates a mesmerizing looping effect by continuously moving the camera through repeating geometric segments. When to Use Use this Capability contract not published. No trust telemetry is available yet. 5 GitHub stars reported by the source. Last updated 4/15/2026.
Freshness
Last checked 4/15/2026
Best For
infinite-tunnel is best for diverse workflows where OpenClaw compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
editorial-content, GITHUB OPENCLEW, runtime-metrics, public facts pack
This skill covers creating infinite tunnel effects using Three.js and GSAP --- name: infinite-tunnel description: This skill covers creating infinite tunnel effects using Three.js and GSAP --- Three.js Infinite Tunnel Effect Skill Overview This skill covers creating infinite tunnel effects using Three.js and GSAP (GreenSock Animation Platform). An infinite tunnel creates a mesmerizing looping effect by continuously moving the camera through repeating geometric segments. When to Use Use this
Public facts
5
Change events
1
Artifacts
0
Freshness
Apr 15, 2026
Capability contract not published. No trust telemetry is available yet. 5 GitHub stars reported by the source. Last updated 4/15/2026.
Trust score
Unknown
Compatibility
OpenClaw
Freshness
Apr 15, 2026
Vendor
Ambershen
Artifacts
0
Benchmarks
0
Last release
Unpublished
Key links, install path, and a quick operational read before the deeper crawl record.
Summary
Capability contract not published. No trust telemetry is available yet. 5 GitHub stars reported by the source. Last updated 4/15/2026.
Setup snapshot
git clone https://github.com/ambershen/infinite-tunnel.gitSetup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.
Vendor
Ambershen
Protocol compatibility
OpenClaw
Adoption signal
5 GitHub stars
Handshake status
UNKNOWN
Crawlable docs
6 indexed pages on the official domain
Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.
Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.
Extracted files
0
Examples
6
Snippets
0
Languages
typescript
Parameters
javascript
// Calculate position on curve const pos = curve.getPointAt(t_slot); // Calculate local coordinate frame const tangent = curve.getTangentAt(t_slot).normalize(); const up = new THREE.Vector3(0, 1, 0); // Handle Gimbal lock for vertical tangents if (Math.abs(tangent.y) > 0.9) up.set(0, 0, 1); const normal = new THREE.Vector3().crossVectors(tangent, up).normalize(); const binormal = new THREE.Vector3().crossVectors(tangent, normal).normalize(); // Offset from center to wall const angle = (slotIndex * 137.5) * (Math.PI / 180); // Golden angle distribution const radius = tubeRadius - 1.5; const offset = new THREE.Vector3() .addScaledVector(normal, Math.cos(angle) * radius) .addScaledVector(binormal, Math.sin(angle) * radius); item.group.position.copy(pos).add(offset); item.group.lookAt(pos); // Face center
javascript
// Enable recursive search (true)
const intersects = raycaster.intersectObjects(interactables, true);
if (intersects.length > 0) {
let hitMesh = intersects[0].object;
// Traverse up to find the root mesh
while (hitMesh && !interactables.includes(hitMesh)) {
hitMesh = hitMesh.parent;
}
// Now hitMesh corresponds to your pool item
}javascript
function enterDetailMode(item) {
// Calculate a target position in front of the image
const centerPos = item.group.position.clone()
.add(item.group.getWorldDirection(new THREE.Vector3()).multiplyScalar(2));
gsap.to(camera.position, {
x: centerPos.x,
y: centerPos.y,
z: centerPos.z,
duration: 1.5,
ease: "power2.inOut",
onUpdate: () => camera.lookAt(item.group.position)
});
}javascript
const planeGeometry = new THREE.PlaneGeometry(1, 1); // When texture loads: const aspect = tex.image.width / tex.image.height; const targetHeight = 2.0; // Scale width proportional to aspect ratio, keep height fixed mesh.scale.set(targetHeight * aspect, targetHeight, 1);
javascript
const stringPoints = [ new THREE.Vector3(-0.5, 0.5, 0), // Top-left of 1x1 plane new THREE.Vector3(-0.5, 5.0, 0), // Up into the ceiling new THREE.Vector3(0.5, 0.5, 0), // Top-right new THREE.Vector3(0.5, 5.0, 0) ]; const strings = new THREE.LineSegments(...); mesh.add(strings); // Add as child so it scales with the image
javascript
import * as THREE from 'three';
import { gsap } from 'gsap';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
camera.position.z = 5;Full documentation captured from public sources, including the complete README when available.
Docs source
GITHUB OPENCLEW
Editorial quality
ready
This skill covers creating infinite tunnel effects using Three.js and GSAP --- name: infinite-tunnel description: This skill covers creating infinite tunnel effects using Three.js and GSAP --- Three.js Infinite Tunnel Effect Skill Overview This skill covers creating infinite tunnel effects using Three.js and GSAP (GreenSock Animation Platform). An infinite tunnel creates a mesmerizing looping effect by continuously moving the camera through repeating geometric segments. When to Use Use this
This skill covers creating infinite tunnel effects using Three.js and GSAP (GreenSock Animation Platform). An infinite tunnel creates a mesmerizing looping effect by continuously moving the camera through repeating geometric segments.
Use this skill when:
Three.js for 3D rendering and GSAP for smooth animations.The infinite tunnel effect relies on a simple principle:
Instead of placing objects in a straight line, use a CatmullRomCurve3 to create a winding path. Objects are positioned on the tunnel "walls" using tangent, normal, and binormal vectors.
// Calculate position on curve
const pos = curve.getPointAt(t_slot);
// Calculate local coordinate frame
const tangent = curve.getTangentAt(t_slot).normalize();
const up = new THREE.Vector3(0, 1, 0);
// Handle Gimbal lock for vertical tangents
if (Math.abs(tangent.y) > 0.9) up.set(0, 0, 1);
const normal = new THREE.Vector3().crossVectors(tangent, up).normalize();
const binormal = new THREE.Vector3().crossVectors(tangent, normal).normalize();
// Offset from center to wall
const angle = (slotIndex * 137.5) * (Math.PI / 180); // Golden angle distribution
const radius = tubeRadius - 1.5;
const offset = new THREE.Vector3()
.addScaledVector(normal, Math.cos(angle) * radius)
.addScaledVector(binormal, Math.sin(angle) * radius);
item.group.position.copy(pos).add(offset);
item.group.lookAt(pos); // Face center
When objects have children (like borders or suspension strings), simple raycasting fails. Use recursive checking and traverse up the parent chain to identify the logical "item".
// Enable recursive search (true)
const intersects = raycaster.intersectObjects(interactables, true);
if (intersects.length > 0) {
let hitMesh = intersects[0].object;
// Traverse up to find the root mesh
while (hitMesh && !interactables.includes(hitMesh)) {
hitMesh = hitMesh.parent;
}
// Now hitMesh corresponds to your pool item
}
Seamlessly switch between "Tunnel Mode" (scrolling) and "Detail Mode" (focused view) using GSAP to animate the camera.
function enterDetailMode(item) {
// Calculate a target position in front of the image
const centerPos = item.group.position.clone()
.add(item.group.getWorldDirection(new THREE.Vector3()).multiplyScalar(2));
gsap.to(camera.position, {
x: centerPos.x,
y: centerPos.y,
z: centerPos.z,
duration: 1.5,
ease: "power2.inOut",
onUpdate: () => camera.lookAt(item.group.position)
});
}
To support diverse content types (portrait/landscape) without distortion, use a unit square geometry (1x1) and scale the mesh based on the loaded texture's aspect ratio.
const planeGeometry = new THREE.PlaneGeometry(1, 1);
// When texture loads:
const aspect = tex.image.width / tex.image.height;
const targetHeight = 2.0;
// Scale width proportional to aspect ratio, keep height fixed
mesh.scale.set(targetHeight * aspect, targetHeight, 1);
Add "hanging wires" to objects that automatically adjust to the object's scale by attaching them to the mesh's coordinate system.
const stringPoints = [
new THREE.Vector3(-0.5, 0.5, 0), // Top-left of 1x1 plane
new THREE.Vector3(-0.5, 5.0, 0), // Up into the ceiling
new THREE.Vector3(0.5, 0.5, 0), // Top-right
new THREE.Vector3(0.5, 5.0, 0)
];
const strings = new THREE.LineSegments(...);
mesh.add(strings); // Add as child so it scales with the image
import * as THREE from 'three';
import { gsap } from 'gsap';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
camera.position.z = 5;
const segments = [];
const segmentSpacing = 2;
const numSegments = 50;
for (let i = 0; i < numSegments; i++) {
const geometry = new THREE.TorusGeometry(3, 0.1, 16, 32);
const material = new THREE.MeshBasicMaterial({
color: new THREE.Color(`hsl(${i * 7}, 70%, 50%)`),
wireframe: true
});
const segment = new THREE.Mesh(geometry, material);
segment.position.z = -i * segmentSpacing;
segment.userData.initialZ = segment.position.z;
segments.push(segment);
scene.add(segment);
}
const tunnelLength = numSegments * segmentSpacing;
gsap.to(camera.position, {
z: -tunnelLength,
duration: 20,
ease: 'none',
repeat: -1,
onUpdate: () => {
segments.forEach(segment => {
// When segment is behind camera, move it to the front
if (segment.position.z > camera.position.z + 10) {
segment.position.z -= tunnelLength;
}
});
}
});
Use InstancedMesh for many identical segments:
const geometry = new THREE.TorusGeometry(3, 0.1, 16, 32);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const count = 100;
const instancedMesh = new THREE.InstancedMesh(geometry, material, count);
const dummy = new THREE.Object3D();
for (let i = 0; i < count; i++) {
dummy.position.z = -i * segmentSpacing;
dummy.updateMatrix();
instancedMesh.setMatrixAt(i, dummy.matrix);
}
instancedMesh.instanceMatrix.needsUpdate = true;
scene.add(instancedMesh);
Optimize geometry:
BufferGeometry instead of regular geometryCalculate tunnel length carefully:
const segmentSpacing = 2;
const numSegments = 50;
const tunnelLength = numSegments * segmentSpacing;
// Ensure enough segments to fill view + buffer
const fov = 75;
const aspectRatio = window.innerWidth / window.innerHeight;
const minSegments = Math.ceil(tunnelLength / segmentSpacing) + 5; // +5 buffer
Proper wrapping logic:
// Option 1: Simple wraparound
if (segment.position.z > camera.position.z + wrapDistance) {
segment.position.z -= tunnelLength;
}
// Option 2: Modulo approach (smoother)
const relativeZ = segment.position.z - camera.position.z;
if (relativeZ > wrapDistance) {
segment.position.z = camera.position.z - tunnelLength + (relativeZ % tunnelLength);
}
Use GSAP effectively:
// Constant speed tunnel
gsap.to(camera.position, {
z: -tunnelLength,
duration: 20,
ease: 'none', // Linear motion
repeat: -1,
repeatDelay: 0
});
// Variable speed with easing
const tl = gsap.timeline({ repeat: -1 });
tl.to(camera.position, { z: -50, duration: 5, ease: 'power1.inOut' })
.to(camera.position, { z: -100, duration: 3, ease: 'power2.in' });
Color gradients:
segments.forEach((segment, i) => {
const hue = (i * 10 + Date.now() * 0.05) % 360;
segment.material.color.setHSL(hue / 360, 0.7, 0.5);
});
Rotation patterns:
segments.forEach((segment, i) => {
segment.rotation.z += 0.01 * (1 + i * 0.01);
// Or synchronized rotation
segment.rotation.z = (Date.now() * 0.001 + i * 0.1) % (Math.PI * 2);
});
Scaling effects:
const scaleOscillation = Math.sin(Date.now() * 0.001 + i * 0.5) * 0.2 + 1;
segment.scale.set(scaleOscillation, scaleOscillation, 1);
const geometry = new THREE.TorusGeometry(3, 0.1, 16, 32);
const material = new THREE.MeshBasicMaterial({
wireframe: true,
color: 0x00ffff
});
const material = new THREE.MeshBasicMaterial({
color: 0xff00ff,
transparent: true,
opacity: 0.8,
blending: THREE.AdditiveBlending
});
// Add point lights
segments.forEach(segment => {
const light = new THREE.PointLight(0xff00ff, 2, 10);
light.position.copy(segment.position);
scene.add(light);
});
const geometries = [
new THREE.TorusGeometry(3, 0.1, 16, 32),
new THREE.RingGeometry(2, 3, 32),
new THREE.OctahedronGeometry(2),
new THREE.BoxGeometry(4, 4, 0.2)
];
segments.forEach((segment, i) => {
segment.geometry = geometries[i % geometries.length];
});
const particleCount = 5000;
const geometry = new THREE.BufferGeometry();
const positions = new Float32Array(particleCount * 3);
const colors = new Float32Array(particleCount * 3);
for (let i = 0; i < particleCount; i++) {
const angle = Math.random() * Math.PI * 2;
const radius = 2 + Math.random() * 2;
positions[i * 3] = Math.cos(angle) * radius;
positions[i * 3 + 1] = Math.sin(angle) * radius;
positions[i * 3 + 2] = -Math.random() * tunnelLength;
colors[i * 3] = Math.random();
colors[i * 3 + 1] = Math.random();
colors[i * 3 + 2] = 1;
}
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));
const material = new THREE.PointsMaterial({
size: 0.1,
vertexColors: true,
blending: THREE.AdditiveBlending
});
const particles = new THREE.Points(geometry, material);
scene.add(particles);
// Turbulence effect
gsap.to(camera.rotation, {
x: '+=0.1',
y: '+=0.05',
duration: 2,
yoyo: true,
repeat: -1,
ease: 'sine.inOut'
});
// Banking on turns
gsap.to(camera.rotation, {
z: 0.3,
duration: 1,
ease: 'power2.inOut',
onComplete: () => {
gsap.to(camera.rotation, { z: 0, duration: 1 });
}
});
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass';
const composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
const bloomPass = new UnrealBloomPass(
new THREE.Vector2(window.innerWidth, window.innerHeight),
1.5, // strength
0.4, // radius
0.85 // threshold
);
composer.addPass(bloomPass);
// In animation loop, use composer instead of renderer
composer.render();
const vertexShader = `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
const fragmentShader = `
uniform float time;
varying vec2 vUv;
void main() {
vec2 center = vUv - 0.5;
float dist = length(center);
float pulse = sin(dist * 10.0 - time * 2.0) * 0.5 + 0.5;
vec3 color = vec3(pulse, 0.5, 1.0 - pulse);
gl_FragColor = vec4(color, 1.0);
}
`;
const material = new THREE.ShaderMaterial({
vertexShader,
fragmentShader,
uniforms: { time: { value: 0 } }
});
Solution: Increase buffer segments and adjust wrap distance
const visibleDistance = 15; // Distance where segments are visible
const wrapDistance = visibleDistance + 5; // Add buffer
Solution: Use ease: 'none' for constant speed and ensure consistent frame rate
gsap.ticker.fps(60); // Lock to 60fps
gsap.to(camera.position, {
z: -tunnelLength,
duration: 20,
ease: 'none'
});
Solutions:
Solution: Ensure proper segment spacing calculation
const geometry = new THREE.TorusGeometry(3, 0.1, 16, 32);
const boundingBox = new THREE.Box3().setFromObject(new THREE.Mesh(geometry));
const segmentDepth = boundingBox.max.z - boundingBox.min.z;
const segmentSpacing = segmentDepth * 0.9; // Slight overlap
import * as THREE from 'three';
import { gsap } from 'gsap';
// Setup
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x000000);
scene.fog = new THREE.Fog(0x000000, 1, 50);
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.z = 5;
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Tunnel creation
const segments = [];
const segmentSpacing = 2;
const numSegments = 50;
const tunnelLength = numSegments * segmentSpacing;
for (let i = 0; i < numSegments; i++) {
const geometry = new THREE.TorusGeometry(3, 0.1, 16, 32);
const material = new THREE.MeshBasicMaterial({
color: new THREE.Color(`hsl(${i * 7}, 70%, 50%)`),
wireframe: true
});
const segment = new THREE.Mesh(geometry, material);
segment.position.z = -i * segmentSpacing;
segments.push(segment);
scene.add(segment);
}
// Animation
gsap.to(camera.position, {
z: -tunnelLength,
duration: 20,
ease: 'none',
repeat: -1,
onUpdate: () => {
segments.forEach(segment => {
if (segment.position.z > camera.position.z + 10) {
segment.position.z -= tunnelLength;
}
});
}
});
// Render loop
function animate() {
requestAnimationFrame(animate);
segments.forEach((segment, i) => {
segment.rotation.z += 0.01 * (1 + i * 0.01);
});
renderer.render(scene, camera);
}
animate();
// Handle window resize
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
Replace auto-movement with smooth scroll interaction.
const state = {
zPos: 0,
targetZ: 0
};
// Listen for scroll events
window.addEventListener('wheel', (e) => {
// Normalize scroll delta
const delta = Math.sign(e.deltaY) * Math.min(Math.abs(e.deltaY), 10);
// Scroll down (positive delta) moves forward (negative Z)
state.targetZ -= delta * 0.5;
});
function animate() {
// Smoothly interpolate current position to target
state.zPos += (state.targetZ - state.zPos) * 0.1;
camera.position.z = state.zPos;
// Update infinite loop logic (same as basic pattern)
segments.forEach(segment => {
if (segment.position.z > camera.position.z + 10) {
segment.position.z -= tunnelLength;
}
});
renderer.render(scene, camera);
}
Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/snapshot"
curl -s "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract"
curl -s "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust"
Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.
Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.
Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Rank
70
AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs
Traction
No public download signal
Freshness
Updated 6d ago
Rank
70
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
Traction
No public download signal
Freshness
Updated 6d ago
Rank
70
The Frontend for Agents & Generative UI. React + Angular
Traction
No public download signal
Freshness
Updated 23d ago
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"OPENCLEW"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "GITHUB_OPENCLEW",
"generatedAt": "2026-04-17T03:22:03.861Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "OPENCLEW",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
},
{
"key": "diverse",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
}
],
"flattenedTokens": "protocol:OPENCLEW|unknown|profile capability:diverse|supported|profile"
}Facts JSON
[
{
"factKey": "docs_crawl",
"category": "integration",
"label": "Crawlable docs",
"value": "6 indexed pages on the official domain",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
},
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Ambershen",
"href": "https://github.com/ambershen/infinite-tunnel",
"sourceUrl": "https://github.com/ambershen/infinite-tunnel",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T03:14:20.882Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-04-15T03:14:20.882Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "5 GitHub stars",
"href": "https://github.com/ambershen/infinite-tunnel",
"sourceUrl": "https://github.com/ambershen/infinite-tunnel",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T03:14:20.882Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "docs_update",
"title": "Docs refreshed: Sign in to GitHub · GitHub",
"description": "Fresh crawlable documentation was indexed for the official domain.",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
}
]Sponsored
Ads related to infinite-tunnel and adjacent AI workflows.