Skip to content // StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
// StreakField — signal simulation
const GRID = 128; // flow potential lattice
let phase = 0; // A→B morph, ~14s per epoch
const curl = (x, y) => {
const dx = sample(x + h, y) - sample(x - h, y);
const dy = sample(x, y + h) - sample(x, y - h);
return [dy * FLOW, -dx * FLOW]; // divergence-free: pure swirl
};
for (let i = 0; i < P; i++) {
const [u, v] = curl(px[i], py[i]);
px[i] += (u + vortex.x + scatter.x) * dt * rush;
py[i] += (v + vortex.y + scatter.y) * dt * rush;
// cursor crush: flash teal, kick outward, spring home
if (d2(ptr, i) < R && ptr.speed > MIN) {
flash[i] = 1;
kick(i, ptr, (1 - d2 / R) * ptr.speed * IMPULSE);
}
charge[i] = Math.max(flash[i] *= COOL, trailGlow(px[i], py[i]));
}
// trails: fade pass 4.5% → filaments persist ~25 frames
fade(fbo, 0.045); draw(points, ADDITIVE); composite(fbo, screen);
VM
2026
Vidown Razvio sam Vidown, aplikaciju za preuzimanje videa koja omogućava korisnicima da spremaju videe s različitih online platformi na svoje lokalne uređaje. Ovaj projekt bio je fokusiran na stvaranje pouzdanog i korisno prijateljskog rješenja za offline pristup videima.
Zadatak
Korisnici su trebali pojednostavljen način preuzimanja videa s više platformi bez bavljenja složenim proširenjima preglednika ili nepouzdanim online pretvaračima. Morao sam riješiti tehničku složenost rukovanja različitim video formatima, opcijama kvalitete i zahtjevima specifičnim za platforme, a pritom zadržati jednostavno korisničko iskustvo.
01
Preuzimanje videa ne bi trebalo biti raketna znanost. Korisnici su trebali pojednostavljen način preuzimanja videa s više platformi bez bavljenja složenim proširenjima preglednika ili nepouzdanim online pretvaračima. Morao sam riješiti tehničku složenost rukovanja različitim video formatima, opcijama kvalitete i zahtjevima specifičnim za platforme, a pritom zadržati jednostavno korisničko iskustvo.
02
Jedan klik, beskrajne mogućnosti. Napravio sam robustan engine za preuzimanje koji podržava više video platformi i formata, implementirajući pametno prepoznavanje kvalitete i mogućnosti batch obrade. Dao sam prioritet stvaranju intuitivnog sučelja koje apstraktizira tehničku složenost, a istovremeno daje korisnicima kontrolu nad preferencijama preuzimanja i upravljanjem datoteka.
03
Napravljen za brzinu, dizajniran za jednostavnost. Počeo sam istraživanjem API-jeva i protokola za ekstraktiranje videa, zatim sam razvio modularnu arhitekturu koja može lako primiti nove platforme. Implementirao sam sveobuhvatan error handling i praćenje napretka, a potom ekstenzivno testiranje preko različitih video izvora i mrežnih uvjeta kako bih osigurao pouzdanost.
04
Preuzimanja isporučena, korisnici oduševljeni. Aplikacija uspješno rješava preuzimanja s glavnih video platformi s 95% stopom uspjeha i značajno poboljšanim brzinama preuzimanja u odnosu na postojeća rješenja. Stekao sam vrijedno iskustvo u API integraciji, rukovanju datotekama i stvaranju otpornih aplikacija koje elegantno rješavaju mrežnu varijabilnost i raznolike izvore sadržaja.
Do Not Touch