⚡ next‑gen intelligence

Build smarter with
AI · RAG · Embedded · IoT

Apisto‑Tech delivers end‑to‑end solutions — from intelligent agents and retrieval‑augmented generation to embedded systems, IoT, and custom software.

Explore services Talk to an expert
What we do full‑stack engineering for the intelligent era
🧠

Artificial Intelligence

LLMs, computer vision, predictive models & autonomous agents.

📚

RAG

Retrieval‑augmented generation with enterprise knowledge bases.

⚙️

Embedded Systems

Firmware, RTOS, edge AI, and low‑power device engineering.

📡

IoT

Sensor networks, cloud integration, real‑time telemetry & control.

💻

Software Dev

Full‑stack, microservices, APIs, and scalable cloud platforms.

Intelligence meets hardware

We merge AI and RAG with embedded & IoT — creating systems that perceive, reason, and act in the physical world. From edge inference to knowledge‑aware agents.

  • Custom RAG pipelines with vector DBs
  • Embedded AI / TinyML on microcontrollers
  • IoT + cloud orchestration (AWS, Azure, GCP)
  • End‑to‑end software & DevOps
AI + RAG Embedded · IoT · Software ⚡📡
12+ AI models deployed
8 RAG implementations
50k+ IoT devices connected
100% custom software delivery
Apisto‑Tech · AI · RAG · Embedded · IoT · Software
© 2026 Apisto‑Tech — built for the intelligent future
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); renderer.toneMapping = THREE.ReinhardToneMapping; renderer.toneMappingExposure = 1.3; const composer = new EffectComposer(renderer); composer.addPass(new RenderPass(scene, camera)); composer.addPass(new UnrealBloomPass( new THREE.Vector2(window.innerWidth, window.innerHeight), 0.9, 0.4, 0.05 )); // ── Lights ────────────────────────────────────────────── scene.add(new THREE.AmbientLight(0x223366, 2)); const l1 = new THREE.PointLight(0x4488ff, 2, 30); l1.position.set(0, 5, 5); scene.add(l1); const l2 = new THREE.PointLight(0xaa44ff, 1.5, 25); l2.position.set(-5, -3, 4); scene.add(l2); // ── Node definitions: label, position, color, size ────── // Flow: Embedded → IoT → RAG → AI (center/top = brain) const nodeDefs = [ { label: 'Embedded', pos: [-5, -2.5, 0], color: 0x22aaff, emissive: 0x0055aa, size: 0.55 }, { label: 'IoT', pos: [-1.5, -3.5, 0], color: 0x00ddaa, emissive: 0x007755, size: 0.6 }, { label: 'RAG', pos: [ 2.5, -1.5, 0], color: 0xaa55ff, emissive: 0x6600cc, size: 0.65 }, { label: 'AI', pos: [ 0, 2.5, 0], color: 0xff8844, emissive: 0xcc4400, size: 0.9 }, { label: 'Cloud', pos: [ 5, 1.0, 0], color: 0x44ddff, emissive: 0x0088aa, size: 0.5 }, { label: 'Software', pos: [-4, 2.0, 0], color: 0xff44aa, emissive: 0xaa0055, size: 0.5 }, ]; // ── Build node meshes ──────────────────────────────────── function makeNode(def) { const group = new THREE.Group(); // Outer glow sphere (transparent, larger) const glowGeo = new THREE.SphereGeometry(def.size * 1.6, 32, 32); const glowMat = new THREE.MeshStandardMaterial({ color: def.color, emissive: def.emissive, transparent: true, opacity: 0.12, roughness: 1, metalness: 0 }); group.add(new THREE.Mesh(glowGeo, glowMat)); // Core solid sphere const coreGeo = new THREE.SphereGeometry(def.size, 32, 32); const coreMat = new THREE.MeshStandardMaterial({ color: def.color, emissive: def.emissive, roughness: 0.2, metalness: 0.8, transparent: true, opacity: 0.95 }); const coreMesh = new THREE.Mesh(coreGeo, coreMat); group.add(coreMesh); // Wireframe shell const wireMat = new THREE.MeshStandardMaterial({ color: def.color, emissive: def.emissive, wireframe: true, transparent: true, opacity: 0.3 }); const wireMesh = new THREE.Mesh(new THREE.IcosahedronGeometry(def.size * 1.05, 1), wireMat); group.add(wireMesh); // Orbital ring const ringGeo = new THREE.TorusGeometry(def.size * 1.4, 0.018, 16, 60); const ringMat = new THREE.MeshStandardMaterial({ color: def.color, emissive: def.emissive, transparent: true, opacity: 0.6 }); const ringMesh = new THREE.Mesh(ringGeo, ringMat); ringMesh.rotation.x = Math.PI / 3 + Math.random() * 0.5; ringMesh.rotation.z = Math.random() * Math.PI; group.add(ringMesh); group.position.set(...def.pos); group.userData = { def, coreMesh, wireMesh, ringMesh, glowMat, baseY: def.pos[1] }; return group; } const nodes = nodeDefs.map(makeNode); nodes.forEach(n => scene.add(n)); // ── Label sprites ──────────────────────────────────────── function makeLabel(text, color) { const cvs = document.createElement('canvas'); cvs.width = 256; cvs.height = 80; const ctx = cvs.getContext('2d'); ctx.clearRect(0, 0, 256, 80); ctx.font = 'bold 36px Inter, sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; // glow ctx.shadowColor = color; ctx.shadowBlur = 18; ctx.fillStyle = '#ffffff'; ctx.fillText(text, 128, 40); const tex = new THREE.CanvasTexture(cvs); const sp = new THREE.Sprite(new THREE.SpriteMaterial({ map: tex, transparent: true, depthWrite: false })); sp.scale.set(2.2, 0.7, 1); return sp; } const labelColors = ['#22aaff','#00ddaa','#aa55ff','#ff8844','#44ddff','#ff44aa']; nodes.forEach((node, i) => { const lbl = makeLabel(nodeDefs[i].label, labelColors[i]); lbl.position.set(0, -nodeDefs[i].size - 0.75, 0); node.add(lbl); }); // ── Connection edges ───────────────────────────────────── // Edges: [from, to] — representing data flow const edgeDefs = [ [0, 1], // Embedded → IoT [1, 2], // IoT → RAG [2, 3], // RAG → AI [1, 3], // IoT → AI (direct) [3, 4], // AI → Cloud [3, 5], // AI → Software [0, 5], // Embedded → Software [4, 2], // Cloud → RAG ]; // Static tube connections const edgeMeshes = edgeDefs.map(([a, b]) => { const pa = new THREE.Vector3(...nodeDefs[a].pos); const pb = new THREE.Vector3(...nodeDefs[b].pos); const points = []; for (let i = 0; i <= 20; i++) { const t = i / 20; const mid = new THREE.Vector3().lerpVectors(pa, pb, t); mid.z += Math.sin(t * Math.PI) * 0.3; // slight arc points.push(mid); } const curve = new THREE.CatmullRomCurve3(points); const geo = new THREE.TubeGeometry(curve, 20, 0.018, 6, false); const mat = new THREE.MeshStandardMaterial({ color: 0x224466, emissive: 0x112233, transparent: true, opacity: 0.35, roughness: 1 }); return { mesh: new THREE.Mesh(geo, mat), pa, pb }; }); edgeMeshes.forEach(e => scene.add(e.mesh)); // ── Animated data pulses along edges ──────────────────── // Each pulse is a glowing sphere traveling from→to const pulses = []; const pulseColors = [0x22aaff, 0x00ddaa, 0xaa55ff, 0xff8844, 0x44ddff, 0xff44aa, 0xffffff, 0x88ffcc]; edgeDefs.forEach(([a, b], i) => { const pa = new THREE.Vector3(...nodeDefs[a].pos); const pb = new THREE.Vector3(...nodeDefs[b].pos); const points = []; for (let k = 0; k <= 20; k++) { const t = k / 20; const mid = new THREE.Vector3().lerpVectors(pa, pb, t); mid.z += Math.sin(t * Math.PI) * 0.3; points.push(mid); } const curve = new THREE.CatmullRomCurve3(points); const col = pulseColors[i % pulseColors.length]; const geo = new THREE.SphereGeometry(0.09, 12, 12); const mat = new THREE.MeshStandardMaterial({ color: col, emissive: col, transparent: true, opacity: 0.95 }); const mesh = new THREE.Mesh(geo, mat); scene.add(mesh); pulses.push({ mesh, curve, speed: 0.12 + Math.random() * 0.1, offset: Math.random(), // stagger start trail: [] // for motion trail }); }); // ── Starfield ──────────────────────────────────────────── const starCount = 1800; const starGeo = new THREE.BufferGeometry(); const starPos = new Float32Array(starCount * 3); const starCol = new Float32Array(starCount * 3); for (let i = 0; i < starCount; i++) { const r = 20 + Math.random() * 40; const theta = Math.random() * Math.PI * 2; const phi = Math.acos((Math.random() * 2) - 1); starPos[i*3] = Math.sin(phi)*Math.cos(theta)*r; starPos[i*3+1] = Math.sin(phi)*Math.sin(theta)*r*0.6; starPos[i*3+2] = Math.cos(phi)*r; const c = 0.5 + Math.random()*0.5; const t = Math.random(); if (t<0.33) { starCol[i*3]=0.6*c; starCol[i*3+1]=0.8*c; starCol[i*3+2]=c; } else if (t<0.66) { starCol[i*3]=0.8*c; starCol[i*3+1]=0.5*c; starCol[i*3+2]=c; } else { starCol[i*3]=c; starCol[i*3+1]=c; starCol[i*3+2]=c; } } starGeo.setAttribute('position', new THREE.BufferAttribute(starPos, 3)); starGeo.setAttribute('color', new THREE.BufferAttribute(starCol, 3)); scene.add(new THREE.Points(starGeo, new THREE.PointsMaterial({ size: 0.12, vertexColors: true, transparent: true, opacity: 0.85, blending: THREE.AdditiveBlending, depthWrite: false }))); // ── Slow scene rotation group ──────────────────────────── const networkGroup = new THREE.Group(); nodes.forEach(n => networkGroup.add(n)); edgeMeshes.forEach(e => networkGroup.add(e.mesh)); scene.add(networkGroup); // move pulses to scene directly (already done above) // ── Animate ────────────────────────────────────────────── function animate() { const t = performance.now() / 1000; // Slowly rotate the whole network networkGroup.rotation.y = t * 0.06; networkGroup.rotation.x = Math.sin(t * 0.04) * 0.12; // Pulse & bob each node nodes.forEach((node, i) => { const { coreMesh, wireMesh, ringMesh, glowMat, baseY, def } = node.userData; node.position.y = def.pos[1] + Math.sin(t * 0.7 + i * 1.1) * 0.12; const pulse = 1 + Math.sin(t * 1.5 + i * 0.8) * 0.04; coreMesh.scale.setScalar(pulse); wireMesh.rotation.y += 0.006; wireMesh.rotation.z += 0.003; ringMesh.rotation.z += 0.008 + i * 0.001; glowMat.opacity = 0.08 + Math.sin(t * 1.2 + i) * 0.06; }); // Move data pulses along edges pulses.forEach(p => { // t in [0,1] cycling const progress = ((t * p.speed + p.offset) % 1); // get position on curve — need to transform by networkGroup rotation const localPos = p.curve.getPoint(progress); // apply networkGroup world rotation manually const worldPos = localPos.clone().applyEuler(networkGroup.rotation); p.mesh.position.copy(worldPos); // fade in/out at endpoints const fade = Math.sin(progress * Math.PI); p.mesh.material.opacity = fade * 0.95; p.mesh.scale.setScalar(0.7 + fade * 0.6); }); composer.render(); requestAnimationFrame(animate); } animate(); window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); composer.setSize(window.innerWidth, window.innerHeight); });