{"id":3281,"date":"2026-01-14T17:58:08","date_gmt":"2026-01-14T17:58:08","guid":{"rendered":"https:\/\/test.innovacore.group\/?post_type=portfolio&#038;p=3281"},"modified":"2026-01-15T11:49:37","modified_gmt":"2026-01-15T11:49:37","slug":"epic-formation","status":"publish","type":"portfolio","link":"https:\/\/test.innovacore.group\/it\/portfolio\/epic-formation\/","title":{"rendered":"Epic Formation &#8211; Turn Expertise into Recurring Revenue"},"content":{"rendered":"\n<p>Epic Formation is a certified training center dedicated to transforming professional know-how into recurring revenue streams. Acting as a growth lever for the Innovacore Group, they mutualize high-level skills across teams while empowering external entrepreneurs. By structuring expertise into certified courses, Epic allows businesses to secure their growth strategies and enables individuals to build sustainable ecosystems based on knowledge transmission.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Monetize your skills and accelerate growth with certified training programs.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"Epic Formation","summary":"Turn Expertise into <span class=\"ic-nycd\">Recurring Revenue<\/span>","mission":"<p>To turn static knowledge into dynamic assets. Epic\u2019s mission is to standardize excellence within Innovacore and provide entrepreneurs with the blueprint to convert their specific expertise into scalable, recurring income through professional education.<\/p>\n","impact":"<p>Epic Formation is professionalizing the knowledge economy. By creating a rigorous framework for skill sharing, they are helping companies reduce recruitment costs through internal upskilling while simultaneously enabling a new wave of entrepreneurs to launch profitable, education-based businesses.<\/p>\n","company_logo":"https:\/\/test.innovacore.group\/wp-content\/uploads\/epic-logo-core-innovacore-optimized.jpg","website_url":"","linkedin_url":"","location":"Lyon, France","founded_year":"2016","key_numbers":{"item-0":{"metric_label":"+ training modules","metric_value":"150"},"item-1":{"metric_label":"+ learners","metric_value":"700"},"item-2":{"metric_label":"% Certified Center","metric_value":"100"}},"hiring_status":"hiring","sector":"other","company_type":"enterprise","audience":["b2b","enterprise"],"geo_scope":["national"],"business_model":["services"],"funding_stage":"pre_seed","partnership_type":"creation","logo_animation":"<div id=\"epic-particle-root\">\r\n    <canvas id=\"epicCanvas\"><\/canvas>\r\n<\/div>\r\n\r\n<style>\r\n    #epic-particle-root {\r\n        width: 100%;\r\n        height: 300px; \/* Hauteur fixe respect\u00e9e *\/\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        background: transparent;\r\n        overflow: hidden;\r\n        cursor: crosshair;\r\n    }\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n    const canvas = document.getElementById('epicCanvas');\r\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n    const root = document.getElementById('epic-particle-root');\r\n    \r\n    let width, height;\r\n    let particles = [];\r\n    let mouse = { x: -1000, y: -1000 };\r\n    const particleColor = '#f5f5f5'; \/\/ Toujours ta couleur\r\n    let time = 0;\r\n\r\n    function init() {\r\n        width = root.offsetWidth;\r\n        height = 300;\r\n        \r\n        const dpr = window.devicePixelRatio || 1;\r\n        canvas.width = width * dpr;\r\n        canvas.height = height * dpr;\r\n        canvas.style.width = width + 'px';\r\n        canvas.style.height = height + 'px';\r\n        ctx.scale(dpr, dpr);\r\n\r\n        createLogoParticles();\r\n    }\r\n\r\n    function createLogoParticles() {\r\n        particles = [];\r\n        \r\n        \/\/ --- 1. DESSIN DU \"GABARIT\" (Invisible \u00e0 la fin) ---\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.fillStyle = 'white'; \r\n        \r\n        const cx = width \/ 2;\r\n        const cy = height \/ 2;\r\n\r\n        \/\/ A. L'ICOTYPE (Le symbole Infini)\r\n        \/\/ On le dessine en grand au-dessus\r\n        const iconSize = width < 600 ? 80 : 120;\r\n        ctx.font = `bold ${iconSize}px Arial, sans-serif`;\r\n        \/\/ J'utilise le caract\u00e8re Unicode infini pour simuler le logo\r\n        ctx.fillText('\u221e', cx, cy - 30); \r\n\r\n        \/\/ B. LE TEXTE \"epic formation\"\r\n        \/\/ Plus petit, en dessous\r\n        const textSize = width < 600 ? 30 : 50;\r\n        ctx.font = `bold ${textSize}px Arial, Helvetica, sans-serif`;\r\n        ctx.fillText('epic formation', cx, cy + 50);\r\n\r\n        \/\/ --- 2. SCAN DES PIXELS ---\r\n        const density = 4; \/\/ Finesse des particules\r\n        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\r\n        const dataWidth = canvas.width; \r\n\r\n        for (let y = 0; y < canvas.height; y += density) {\r\n            for (let x = 0; x < canvas.width; x += density) {\r\n                \/\/ Si le pixel est allum\u00e9 (que ce soit l'ic\u00f4ne ou le texte)\r\n                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {\r\n                    const dpr = window.devicePixelRatio || 1;\r\n                    particles.push({\r\n                        x: x \/ dpr,\r\n                        y: y \/ dpr,\r\n                        originX: x \/ dpr,\r\n                        originY: y \/ dpr,\r\n                        vx: 0, \r\n                        vy: 0,\r\n                        size: Math.random() * 1.5 + 0.5,\r\n                        force: Math.random() \r\n                    });\r\n                }\r\n            }\r\n        }\r\n        \r\n        \/\/ Nettoyage du canvas pour ne laisser que les particules\r\n        ctx.clearRect(0, 0, width, height);\r\n    }\r\n\r\n    function draw() {\r\n        ctx.clearRect(0, 0, width, height);\r\n        time += 0.05;\r\n\r\n        ctx.fillStyle = particleColor;\r\n        \r\n        particles.forEach(p => {\r\n            \/\/ 1. Respiration (Vague)\r\n            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;\r\n            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;\r\n            \r\n            \/\/ 2. Interaction Souris (Magn\u00e9tisme invers\u00e9)\r\n            const dx = mouse.x - p.x;\r\n            const dy = mouse.y - p.y;\r\n            const dist = Math.sqrt(dx*dx + dy*dy);\r\n            const radius = 80;\r\n            \r\n            let repelX = 0;\r\n            let repelY = 0;\r\n\r\n            if (dist < radius) {\r\n                const force = (radius - dist) \/ radius;\r\n                const angle = Math.atan2(dy, dx);\r\n                repelX = -Math.cos(angle) * force * 20;\r\n                repelY = -Math.sin(angle) * force * 20;\r\n            }\r\n\r\n            \/\/ 3. Physique (Retour \u00e9lastique)\r\n            const targetX = p.originX + waveX;\r\n            const targetY = p.originY + waveY;\r\n\r\n            const ax = (targetX - p.x) * 0.08;\r\n            const ay = (targetY - p.y) * 0.08;\r\n\r\n            p.vx += ax;\r\n            p.vy += ay;\r\n            p.vx += repelX * 0.5;\r\n            p.vy += repelY * 0.5;\r\n            p.vx *= 0.85; \/\/ Friction\r\n            p.vy *= 0.85;\r\n\r\n            p.x += p.vx;\r\n            p.y += p.vy;\r\n\r\n            ctx.beginPath();\r\n            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\r\n            ctx.fill();\r\n        });\r\n\r\n        requestAnimationFrame(draw);\r\n    }\r\n\r\n    const updateMouse = (e) => {\r\n        const r = canvas.getBoundingClientRect();\r\n        const cx = e.touches ? e.touches[0].clientX : e.clientX;\r\n        const cy = e.touches ? e.touches[0].clientY : e.clientY;\r\n        mouse.x = cx - r.left;\r\n        mouse.y = cy - r.top;\r\n    };\r\n\r\n    window.addEventListener('resize', init);\r\n    canvas.addEventListener('mousemove', updateMouse);\r\n    canvas.addEventListener('touchmove', updateMouse, {passive: true});\r\n    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });\r\n    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });\r\n\r\n    setTimeout(init, 50);\r\n    draw();\r\n})();\r\n<\/script>"},"pt":[],"pipeline":[64,33],"class_list":["post-3281","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry","pipeline-academy","pipeline-core"],"_links":{"self":[{"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/portfolio\/3281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/portfolio\/3281\/revisions"}],"predecessor-version":[{"id":3282,"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/portfolio\/3281\/revisions\/3282"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/media?parent=3281"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/pt?post=3281"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/test.innovacore.group\/it\/wp-json\/wp\/v2\/pipeline?post=3281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}