
6+ years on designing data-heavy Enterprise and AI products. I translate complexity into user-facing clarity.
6+ years on designing data-heavy Enterprise and AI products. I translate complexity into user-facing clarity.

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas

// compiled preview • scanner demo /* generated for visual effect
– not executed */ const SCAN_WIDTH = 8; const FADE_ZONE = 35; cons
t MAX_PARTICLES = 2500; const TRANSITION = 0.05; function clamp(n,
a, b) { return Math.max(a, Math.min(b, n)); } function lerp(a, b,
t) { return a + (b - a) * t; } const now = () => performance.now(
); function rng(min, max) { return Math.random() * (max - min) + m
in; } class Particle { constructor(x, y, vx, vy, r, a) { this.x =
x; this.y = y; this.vx = vx; this.vy = vy; this.r = r; this.a = a;
} step(dt) { this.x += this.vx * dt; this.y += this.vy * dt; } }
const scanner = { x: Math.floor(window.innerWidth / 2), width: SCA
N_WIDTH, glow: 3.5, }; function drawParticle(ctx, p) { ctx.globalA
lpha = clamp(p.a, 0, 1); ctx.drawImage(gradient, p.x - p.r, p.y -
p.r, p.r * 2, p.r * 2); } function tick(t) { const dt = 0.016; } c
onst state = { intensity: 1.2, particles: MAX_PARTICLES }; const b
ounds = { w: window.innerWidth, h: 300 }; const gradient = documen
t.createElement('canvas'); const ctx = gradient.getContext('2d');
ctx.globalCompositeOperation = 'lighter'; const state = { intensit
y: 1.2, particles: MAX_PARTICLES }; const bounds = { w: window.inn
erWidth, h: 300 }; const gradient = document.createElement('canvas
Selected Work
Problems I successfully solved
Fun Projects
Things I'm building
Collaboration
Collaboration
AI & Automation
AI & Automation
Vision & Strategy
Vision & Strategy
System Thinking
System Thinking
Mentorship
Mentorship
User Experience Design
User Experience Design
Information Architecture
Information Architecture
Information Architecture
Storytelling
Storytelling
Design Systems
Design Systems
I make complex data usable, trustworthy, and effective.
About me
About me




6 years of desiging enterprise products
Designed 20+ B2B products
10M+ users impacted globally
4.9+ average app rating on Apple Store
4.7+ app rating on Apple Store





