Dimitrios Mousouroulis

Dimitrios Mousouroulis


Simplified Reporting.

(function () { 'use strict'; /* ======================================================= SCRIPT BLOCK 1 — SAFE INITIALIZATION Retries briefly until Carrd finishes rendering the hero ======================================================= */ var initAttempts = 0; var maxInitAttempts = 80; var initRetryDelay = 60; function initHeroWhenReady() { var root = document.getElementById('dm-hero-premium'); if (!root) { initAttempts += 1; if (initAttempts <= maxInitAttempts) { window.setTimeout(initHeroWhenReady, initRetryDelay); } return; } if (root.getAttribute('data-dm-hero-bound') === '1') { return; } root.setAttribute('data-dm-hero-bound', '1'); var words = Array.prototype.slice.call( root.querySelectorAll('.dm-rotating-word') ); if (words.length < 2) { return; } var isMobile = window.matchMedia ? window.matchMedia('(max-width: 767px)').matches : window.innerWidth <= 767; /* ===================================================== SCRIPT BLOCK 2 — STATE ===================================================== */ var currentIndex = 0; var transitionCount = 0; var animationRunning = false; var heroPassedAboveViewport = false; var rotateTimer = null; var cleanupTimer = null; var restartTimer = null; /* ===================================================== SCRIPT BLOCK 3 — NUMBER OF PASSES Word order: 0 = Smarter 1 = Faster 2 = Clearer Mobile: Smarter → Faster = 1 Faster → Clearer = 2 Desktop: Smarter → Faster = 1 Faster → Clearer = 2 Clearer → Smarter = 3 Smarter → Faster = 4 Faster → Clearer = 5 Clearer → Smarter = 6 Smarter → Faster = 7 Faster → Clearer = 8 ===================================================== */ var desktopTransitionsBeforeStop = 8; var mobileTransitionsBeforeStop = 2; var transitionsBeforeStop = isMobile ? mobileTransitionsBeforeStop : desktopTransitionsBeforeStop; var stopIndex = words.length - 1; /* ===================================================== SCRIPT BLOCK 4 — TIMING Match these to the CSS timing above if you edit speed ===================================================== */ var rotateDelay = 2200; var fadeSpeed = isMobile ? 300 : 220; var desktopRestartDelay = 80; var mobileRestartDelay = 180; /* ===================================================== SCRIPT BLOCK 5 — HELPERS ===================================================== */ function showOnlyWord(index) { words.forEach(function (word, wordIndex) { word.classList.remove('is-active', 'is-exit'); if (wordIndex === index) { word.classList.add('is-active'); } }); } function clearRotationTimers() { window.clearTimeout(rotateTimer); window.clearTimeout(cleanupTimer); rotateTimer = null; cleanupTimer = null; } function clearAllTimers() { clearRotationTimers(); window.clearTimeout(restartTimer); restartTimer = null; } /* ===================================================== SCRIPT BLOCK 6 — ROTATION ENGINE ===================================================== */ function scheduleNextWord() { window.clearTimeout(rotateTimer); rotateTimer = window.setTimeout(function () { showNextWord(); }, rotateDelay); } function showNextWord() { if (!animationRunning) return; var previousIndex = currentIndex; currentIndex = (currentIndex + 1) % words.length; transitionCount += 1; words[previousIndex].classList.remove('is-active'); words[previousIndex].classList.add('is-exit'); words[currentIndex].classList.remove('is-exit'); words[currentIndex].classList.add('is-active'); window.clearTimeout(cleanupTimer); cleanupTimer = window.setTimeout(function () { words[previousIndex].classList.remove('is-exit'); }, fadeSpeed + 40); if ( currentIndex === stopIndex && transitionCount >= transitionsBeforeStop ) { animationRunning = false; window.clearTimeout(rotateTimer); rotateTimer = null; return; } scheduleNextWord(); } function startAnimation() { clearAllTimers(); currentIndex = 0; transitionCount = 0; animationRunning = true; showOnlyWord(currentIndex); scheduleNextWord(); } /* ===================================================== SCRIPT BLOCK 7 — INITIAL START ===================================================== */ startAnimation(); /* ===================================================== SCRIPT BLOCK 8 — RESTART WHEN HERO RETURNS ===================================================== */ if ('IntersectionObserver' in window) { var heroObserver = new IntersectionObserver( function (entries) { var entry = entries[0]; if (!entry) return; if ( !entry.isIntersecting && entry.boundingClientRect.bottom <= 0 ) { heroPassedAboveViewport = true; animationRunning = false; clearRotationTimers(); return; } if ( entry.isIntersecting && heroPassedAboveViewport ) { heroPassedAboveViewport = false; window.clearTimeout(restartTimer); restartTimer = window.setTimeout( startAnimation, isMobile ? mobileRestartDelay : desktopRestartDelay ); } }, { threshold: [0, 0.15] } ); heroObserver.observe(root); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initHeroWhenReady, { once: true }); } else { initHeroWhenReady(); } })();

I turn data, reporting and delivery complexity into clean dashboards and updates that help leaders see what matters and move with confidence.




Experience across sectors


Roles across consulting, life sciences, SaaS, centered on reporting, analytics, and delivery.


Workable
Dayforce
Deloitte
Gilead
UC Irvine
Workable
Dayforce
Deloitte
Gilead
UC Irvine
(function () { /* =================================================== */ /* SECTION 8 — DESKTOP MEASURED LOOP */ /* =================================================== */ function initDesktopLogoMarquee(marquee) { if (!marquee || marquee.dataset.boundDesktop === '1') return; marquee.dataset.boundDesktop = '1'; var firstSet = marquee.querySelector('.dm-logo-set-desktop'); if (!firstSet) return; var resizeTimer; function updateDesktopLogoMarquee() { if (window.matchMedia('(max-width: 768px)').matches) return; var styles = getComputedStyle(marquee); var pxPerSecond = parseFloat(styles.getPropertyValue('--dm-px-per-second')) || 35; var setWidth = firstSet.getBoundingClientRect().width; if (!setWidth) return; marquee.style.setProperty('--dm-set-width', setWidth.toFixed(3) + 'px'); marquee.style.setProperty('--dm-duration', (setWidth / pxPerSecond).toFixed(3) + 's'); } var imgs = marquee.querySelectorAll('img'); imgs.forEach(function (img) { if (!img.complete) { img.addEventListener('load', updateDesktopLogoMarquee, { once: true }); } }); window.addEventListener('load', updateDesktopLogoMarquee); window.addEventListener('resize', function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(updateDesktopLogoMarquee, 120); }); updateDesktopLogoMarquee(); } /* =================================================== */ /* SECTION 9 — MOBILE MEASURED LOOP */ /* =================================================== */ function initMobileLogoMarquee(marquee) { if (!marquee || marquee.dataset.boundMobile === '1') return; marquee.dataset.boundMobile = '1'; var firstSet = marquee.querySelector('.dm-logo-set-mobile'); if (!firstSet) return; var resizeTimer; function updateMobileLogoMarquee() { if (!window.matchMedia('(max-width: 768px)').matches) return; var setWidth = firstSet.getBoundingClientRect().width; if (!setWidth) return; marquee.style.setProperty('--dm-mobile-set-width', setWidth.toFixed(3) + 'px'); } var imgs = marquee.querySelectorAll('img'); imgs.forEach(function (img) { if (!img.complete) { img.addEventListener('load', updateMobileLogoMarquee, { once: true }); } }); window.addEventListener('load', updateMobileLogoMarquee); window.addEventListener('resize', function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(updateMobileLogoMarquee, 120); }); updateMobileLogoMarquee(); } /* =================================================== */ /* SECTION 10 — INIT */ /* =================================================== */ document.querySelectorAll('.dm-logo-marquee-desktop').forEach(initDesktopLogoMarquee); document.querySelectorAll('.dm-logo-marquee-mobile').forEach(initMobileLogoMarquee); })();


Selected business impact


Selected results across executive reporting, analytics, and program coordination.


$35M

Opportunity uncovered

200+

Stakeholders aligned

6+

Years of experience



How I approach the work


I like the kind of work that turns complexity into meaningful output that people can actually use.


Professional Summary


I have worked across consulting, business intelligence, and more recently IT project coordination, often in environments that are complex, fast-moving, and highly cross-functional. That experience has shaped the way I work: bringing structure to ambiguity, making information easier to act on, and turning raw data into output that supports clearer decisions.My background spans sectors including dry bulk shipping, SaaS, and life sciences, with work ranging from sales growth and executive reporting to large-scale IT delivery coordination. What ties it all together is a consistent approach: reducing noise, sharpening the story, and delivering work that is useful, clear, and decision-oriented.

Dimitrios Mousouroulis headshot

Dimitrios Mousouroulis

PMO Analytics Business Intelligence

Raleigh, North Carolina (Eastern Time)

Core strengths

  • Analytical storytelling
  • Clearer decision support
  • PMO and program reporting
  • Executive-ready communication
  • Business intelligence and dashboards

Industries
Life SciencesSaaSConsultingShipping
Top Skills
Power BIDAXExcelPower QueryMPP


Selected project work


A selection of reporting, analysis, and design work built to make business information clearer and more useful.


Dashboard Wireframes

Dashboard wireframes designed to help teams structure reports before development. Built around hierarchy, executive readability, and clearer decision-making.


Pricing Analysis & Forecast

A structured pricing and performance project built to surface trends, support planning, and turn analysis into decision-ready outputs for business stakeholders.


Chart Makeovers

A visual redesign series that turns weaker charts into clearer, more readable alternatives, with a focus on comparison, hierarchy, and communication.


Superstore Sales Analysis

A SQL analytics project using BigQuery to explore sales, profit, margin, and product performance patterns across regions, states, cities, and categories.


European Soccer Analysis

A SQL analytics project using BigQuery to analyze European soccer seasons, leagues, teams, match activity, and player attributes into clear performance insights.


View all



Writing and visual thinking


Short posts on dashboards, chart design, and practical ways to make data easier to understand.


/* ========================================================= BLOCK 9 — CAROUSEL LOGIC + ORIGINAL LOOK LAZY LOADING Only functional change from original: - Posts 3–6 load only when their slide becomes visible. - Posts 1–2 load immediately. ========================================================= */ (function () { var root = document.getElementById('li-carousel-01'); if (!root) return; var slides = Array.prototype.slice.call(root.querySelectorAll('.li-slide')); var prev = root.querySelector('.li-prev'); var next = root.querySelector('.li-next'); var dotsWrap = root.querySelector('.li-dots'); if (!slides.length || !prev || !next || !dotsWrap) return; var page = 0; var perView = 2; var totalPages = 1; var resizeTimer = null; function getPerView() { return window.innerWidth <= 1100 ? 1 : 2; } function getFixedIframeHeight() { var styles = window.getComputedStyle(root); var raw = window.innerWidth <= 1100 ? styles.getPropertyValue('--li-fixed-height-mobile') : styles.getPropertyValue('--li-fixed-height-desktop'); var n = parseFloat(raw); return Number.isFinite(n) ? n : (window.innerWidth <= 1100 ? 515 : 665); } function applyIframeHeights() { var target = getFixedIframeHeight(); var iframes = root.querySelectorAll('iframe'); for (var i = 0; i < iframes.length; i++) { var iframe = iframes[i]; iframe.style.setProperty('height', target + 'px', 'important'); iframe.style.setProperty('min-height', target + 'px', 'important'); iframe.style.setProperty('width', '100%', 'important'); iframe.style.setProperty('min-width', '100%', 'important'); iframe.style.setProperty('max-width', '100%', 'important'); iframe.style.setProperty('display', 'block', 'important'); iframe.style.setProperty('border', '0', 'important'); } } function loadVisibleIframes() { var visibleSlides = root.querySelectorAll('.li-slide:not(.is-hidden)'); for (var i = 0; i < visibleSlides.length; i++) { var iframe = visibleSlides[i].querySelector('iframe'); if (!iframe) continue; if (iframe.getAttribute('data-li-loaded') === 'true') continue; var target = iframe.getAttribute('data-li-src'); if (!target) continue; iframe.setAttribute('src', target); iframe.setAttribute('data-li-loaded', 'true'); } setTimeout(applyIframeHeights, 60); setTimeout(applyIframeHeights, 240); setTimeout(applyIframeHeights, 900); } function trackCarousel(controlType, destinationPage) { if (!window.dmTrack) return; window.dmTrack('insight_carousel_nav', { link_group: 'insights_carousel', control_type: controlType, destination_page: String(destinationPage), total_pages: String(totalPages) }); } function buildDots() { dotsWrap.innerHTML = ''; for (var i = 0; i < totalPages; i++) { var btn = document.createElement('button'); btn.className = 'li-dot' + (i === page ? ' is-active' : ''); btn.type = 'button'; btn.setAttribute('aria-label', 'Go to page ' + (i + 1)); btn.setAttribute('data-index', String(i)); dotsWrap.appendChild(btn); } } function update() { var start = page * perView; var end = Math.min(start + perView, slides.length); for (var i = 0; i < slides.length; i++) { if (i >= start && i < end) { slides[i].classList.remove('is-hidden'); } else { slides[i].classList.add('is-hidden'); } } prev.disabled = page === 0; next.disabled = page >= totalPages - 1; var dots = dotsWrap.children; for (var d = 0; d < dots.length; d++) { if (d === page) { dots[d].classList.add('is-active'); } else { dots[d].classList.remove('is-active'); } } loadVisibleIframes(); setTimeout(applyIframeHeights, 30); setTimeout(applyIframeHeights, 120); } function recalc() { perView = getPerView(); totalPages = Math.max(1, Math.ceil(slides.length / perView)); if (page > totalPages - 1) { page = totalPages - 1; } applyIframeHeights(); buildDots(); update(); } prev.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); if (page > 0) { page -= 1; update(); trackCarousel('prev', page + 1); } }); next.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); if (page < totalPages - 1) { page += 1; update(); trackCarousel('next', page + 1); } }); dotsWrap.addEventListener('click', function (e) { var btn = e.target.closest ? e.target.closest('.li-dot') : null; if (!btn) return; e.preventDefault(); e.stopPropagation(); page = Number(btn.getAttribute('data-index') || 0); update(); trackCarousel('dot', page + 1); }); window.addEventListener('resize', function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(recalc, 120); }); window.addEventListener('load', function () { recalc(); setTimeout(applyIframeHeights, 300); setTimeout(applyIframeHeights, 900); setTimeout(applyIframeHeights, 1600); }); recalc(); })();


Ways to get in touch


Reach out by email, LinkedIn, or Calendly to connect, collaborate, or continue the conversation.




Request my resume


Please enter your email and I will send my resume straight to your inbox.



No thanks


Dark Mode – Init

Font Load – PP Neue

Global Width / Shell

Global Animated BG

GA4 Tracking

Mobile Burger — CSS

Mobile Burger — JS

Cookie Pop Up

Status Dot Animations

Impact Animation

Nav Sticky Glass

Nav Visibility Guard

Nav Link Centering

Nav Link Effects

Nav + Hero – CTA

Botpress Loader

Projects – View All

Projects – CTA Styling

Projects – Meta

Mobile Viewport Fix

Resume Req Modal

Dark Mode – Sections

Dark Mode – Logo

Dark Mode — Visual

Dark Mode — Final