{"id":8821,"date":"2026-01-25T08:43:23","date_gmt":"2026-01-25T07:43:23","guid":{"rendered":"https:\/\/innovacore.group\/?post_type=portfolio&p=8821"},"modified":"2026-03-17T15:54:03","modified_gmt":"2026-03-17T13:54:03","slug":"contribly","status":"publish","type":"portfolio","link":"https:\/\/innovacore.group\/pt-pt\/portfolio\/contribly\/","title":{"rendered":"Contribly &#8211; Aumentar o Envolvimento dos Leitores"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Contribly is a SaaS platform born at The Guardian, designed to master Community Generated Content (CGC) at scale. It streamlines the collection, moderation, and instant publishing of user stories, photos, and videos. By turning passive readers into active contributors, Contribly saves editorial teams significant time while drastically boosting loyalty, time-on-page, and first-party data collection for publishers and brands.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A plataforma SaaS para coletar, moderar e publicar conte\u00fado comunit\u00e1rio em escala.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"Contribly","summary":"A plataforma SaaS para coletar, moderar e publicar conte\u00fado comunit\u00e1rio em escala.","mission":"<p>Transformar o envolvimento da audi\u00eancia num ativo estrat\u00e9gico de neg\u00f3cio. A miss\u00e3o da Contribly \u00e9 ajudar os editores a construir confian\u00e7a profunda e relev\u00e2ncia, tornando f\u00e1cil envolver os leitores na narrativa, convertendo o envolvimento em dados de primeira parte valiosos e no crescimento de assinaturas.<\/p>\n","impact":"<p>A Contribly est\u00e1 redefinindo a rela\u00e7\u00e3o entre editores e audi\u00eancia ao passar de \"broadcasting\" para uma conversa bidirecional. Fornece aos reda\u00e7\u00f5es um modelo de \"valor em troca\" que gera tr\u00e1fego \u00e0 prova de algoritmos e dados de alto valor, essenciais para tornar os modelos de neg\u00f3cio de m\u00e9dia resilientes \u00e0 depend\u00eancia de plataformas sociais.<\/p>\n","company_logo":"https:\/\/innovacore.group\/wp-content\/uploads\/contribly_logo-innovacore-optimized.jpg","website_url":"https:\/\/www.contribly.com\/","linkedin_url":"https:\/\/www.linkedin.com\/company\/contribly\/","location":"Northwich, Reino Unido","founded_year":"","key_numbers":{"item-0":{"metric_label":"Tempo na P\u00e1gina","metric_value":"3-10x"},"item-1":{"metric_label":"Envolvimento Social","metric_value":"3x"},"item-2":{"metric_label":"Aumento de Downloads da App","metric_value":"44%"}},"hiring_status":"sigiloso","sector":"saas","company_type":"startup","audience":["b2b"],"geo_scope":["global"],"business_model":["saas"],"funding_stage":"em curso","partnership_type":"atualiza\u00e7\u00e3o","logo_animation":"<div id=\"contribly-particle-root\">rn    <canvas id=\"contriblyCanvas\"><\/canvas>rn<\/div>rnrn<style>rn    #contribly-particle-root {rn        width: 100%;rn        height: 300px;rn        display: flex;rn        justify-content: center;rn        align-items: center;rn        background: transparent;rn        overflow: hidden;rn        cursor: crosshair;rn    }rn<\/style>rnrn<script>rn(function() {rn    const canvas = document.getElementById('contriblyCanvas');rn    const ctx = canvas.getContext('2d', { willReadFrequently: true });rn    const root = document.getElementById('contribly-particle-root');rn    rn    let width, height;rn    let particles = [];rn    let mouse = { x: -1000, y: -1000 };rn    const particleColor = '#f5f5f5'; \/\/ Gris clair solicitadorn    let time = 0;rnrn    function init() {rn        width = root.offsetWidth;rn        height = 300;rn        rn        const dpr = window.devicePixelRatio || 1;rn        canvas.width = width * dpr;rn        canvas.height = height * dpr;rn        canvas.style.width = width + 'px';rn        canvas.style.height = height + 'px';rn        ctx.scale(dpr, dpr);rnrn        createLogoParticles();rn    }rnrn    function createLogoParticles() {rn        particles = [];rn        const cx = width \/ 2;rn        const cy = height \/ 2;rn        const isMobile = width < 600;rnrn        \/\/ --- 1. CONFIGURATION DU DESSIN ---rn        ctx.fillStyle = 'white';rn        ctx.strokeStyle = 'white';rnrn        \/\/ Dimensions relativesrn        \/\/ On augmente un peu la taille de l'ic\u00f4ne pour bien voir les d\u00e9tailsrn        const iconSize = isMobile ? 60 : 100; rn        const fontSize = isMobile ? 35 : 60;rn        const gap = isMobile ? 15 : 30;rnrn        \/\/ Typorn        ctx.font = `bold ${fontSize}px \"Poppins\", \"Montserrat\", Arial, sans-serif`;rn        const textMetrics = ctx.measureText('Contribly');rn        const textWidth = textMetrics.width;rnrn        \/\/ Centragern        const totalWidth = iconSize + gap + textWidth;rn        const startX = cx - (totalWidth \/ 2);rn        const centerY = cy;rnrn        \/\/ --- 2. DESSIN DE L'IC\u00d4NE (Complexe et fid\u00e8le) ---rn        const ix = startX;rn        const iy = centerY - (iconSize \/ 2);rn        const centerIx = ix + iconSize \/ 2;rn        const centerIy = iy + iconSize \/ 2;rnrn        \/\/ A. Le cadre carr\u00e9 (fin)rn        ctx.lineWidth = iconSize * 0.03;rn        ctx.strokeRect(ix, iy, iconSize, iconSize);rnrn        \/\/ B. Le Point Central (Le plus gros)rn        const centerDotRad = iconSize * 0.12;rn        ctx.beginPath();rn        ctx.arc(centerIx, centerIy, centerDotRad, 0, Math.PI * 2);rn        ctx.fill();rnrn        \/\/ C. Les Points P\u00e9riph\u00e9riques (Tailles et positions vari\u00e9es)rn        const networkRad = iconSize * 0.36; \/\/ Distance au centrern        const bigRad = iconSize * 0.075;   \/\/ Rayon des \"gros\" points p\u00e9riph\u00e9riquesrn        const smallRad = iconSize * 0.045; \/\/ Rayon des \"petits\" pointsrnrn        \/\/ D\u00e9finition manuelle des 6 points pour respecter le logo :rn        \/\/ Angles approximatifs en radians et taille associ\u00e9e.rn        const pointsDef = [rn            { angle: -0.4, size: smallRad }, \/\/ Haut-Droite (petit)rn            { angle: 0.3,  size: smallRad }, \/\/ Droite (petit)rn            { angle: 1.2,  size: bigRad },   \/\/ Bas-Droite (gros)rn            { angle: 2.6,  size: bigRad },   \/\/ Bas-Gauche (gros)rn            { angle: 3.5,  size: smallRad }, \/\/ Gauche (petit)rn            { angle: 4.5,  size: bigRad }    \/\/ Haut-Gauche (gros)rn        ];rnrn        ctx.lineWidth = iconSize * 0.025; \/\/ Lignes de connexion finesrnrn        pointsDef.forEach(pt => {rn            const px = centerIx + Math.cos(pt.angle) * networkRad;rn            const py = centerIy + Math.sin(pt.angle) * networkRad;rnrn            \/\/ 1. A linha de liga\u00e7\u00e3orn            ctx.beginPath();rn            ctx.moveTo(centerIx, centerIy);rn            ctx.lineTo(px, py);rn            ctx.stroke();rnrn            \/\/ 2. O pontorn            ctx.beginPath();rn            ctx.arc(px, py, pt.size, 0, Math.PI * 2);rn            ctx.fill();rn        });rnrnrn        \/\/ --- 3. DESSIN DU TEXTE ---rn        const textX = startX + iconSize + gap;rn        ctx.textAlign = 'left';rn        ctx.textBaseline = 'middle';rn        ctx.fillText('Contribly', textX, centerY);rnrnrn        \/\/ --- 4. SCAN DES PIXELS (Densit\u00e9 \u00e9lev\u00e9e pour le d\u00e9tail) ---rn        const density = 3;rn        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;rn        const dataWidth = canvas.width; rnrn        for (let y = 0; y < canvas.height; y += density) {rn            for (let x = 0; x < canvas.width; x += density) {rn                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {rn                    const dpr = window.devicePixelRatio || 1;rn                    particles.push({rn                        x: x \/ dpr,rn                        y: y \/ dpr,rn                        originX: x \/ dpr,rn                        originY: y \/ dpr,rn                        vx: 0, rn                        vy: 0,rn                        \/\/ Taille de particule l\u00e9g\u00e8rement variable pour le c\u00f4t\u00e9 \"soft\"rn                        size: Math.random() * 1.2 + 0.8, rn                    });rn                }rn            }rn        }rn        rn        ctx.clearRect(0, 0, width, height);rn    }rnrn    function draw() {rn        ctx.clearRect(0, 0, width, height);rn        rn        \/\/ --- PHYSIQUE \"SOFT\" ---rn        time += 0.02; \/\/ Vitesse d'ondulation lenternrn        ctx.fillStyle = particleColor;rn        rn        particles.forEach(p => {rn            \/\/ 1. Respiration lente et amplern            const waveX = Math.sin(time * 0.5 + p.y * 0.03) * 3;rn            const waveY = Math.cos(time * 0.4 + p.x * 0.03) * 3;rnrn            \/\/ 2. Interaction Souris doucern            const dx = mouse.x - p.x;rn            const dy = mouse.y - p.y;rn            const dist = Math.sqrt(dx*dx + dy*dy);rn            const radius = 100;rnrn            let repelX = 0;rn            let repelY = 0;rnrn            if (dist < radius) {rn                const force = (radius - dist) \/ radius;rn                const angle = Math.atan2(dy, dx);rn                \/\/ For\u00e7a moderada (10) para uma repuls\u00e3o vis\u00edvel mas n\u00e3o violentarn                repelX = -Math.cos(angle) * force * 10;rn                repelY = -Math.sin(angle) * force * 10;rn            }rnrn            const targetX = p.originX + waveX;rn            const targetY = p.originY + waveY;rnrn            \/\/ 3. F\u00edsica fluida (Retorno el\u00e1stico suave e alta fric\u00e7\u00e3o)rn            const ax = (targetX - p.x) * 0.02; \/\/ Retorno muito suavern            const ay = (targetY - p.y) * 0.02;rnrn            p.vx += ax;rn            p.vy += ay;rn            p.vx += repelX * 0.2; \/\/ Aplica\u00e7\u00e3o suave da for\u00e7a da mousern            p.vy += repelY * 0.2;rn            rn            \/\/ Fric\u00e7\u00e3o elevada para o efeito \"flutuante na \u00e1gua\"rn            p.vx *= 0.92; rn            p.vy *= 0.92;rnrn            p.x += p.vx;rn            p.y += p.vy;rnrn            ctx.beginPath();rn            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);rn            ctx.fill();rn        });rnrn        requestAnimationFrame(draw);rn    }rnrn    const updateMouse = (e) => {rn        const r = canvas.getBoundingClientRect();rn        const cx = e.touches ? e.touches[0].clientX : e.clientX;rn        const cy = e.touches ? e.touches[0].clientY : e.clientY;rn        mouse.x = cx - r.left;rn        mouse.y = cy - r.top;rn    };rnrn    window.addEventListener('resize', init);rn    canvas.addEventListener('mousemove', updateMouse);rn    canvas.addEventListener('touchmove', updateMouse, {passive: true});rn    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });rn    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });rnrn    setTimeout(init, 100);rn    draw();rn})();rn<\/script>"},"pt":[],"pipeline":[],"class_list":["post-8821","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/portfolio\/8821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/portfolio\/8821\/revisions"}],"predecessor-version":[{"id":8822,"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/portfolio\/8821\/revisions\/8822"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/media?parent=8821"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/pt?post=8821"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/innovacore.group\/pt-pt\/wp-json\/wp\/v2\/pipeline?post=8821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}