No heredamos solamente
un apellido.

Heredamos una historia.

SOMOS HUMANIDAD

Preservando la memoria humana para las próximas generaciones.

¿Qué ocurre cuando la última persona
que recuerda una historia desaparece?

Historias perdidas

Cientos de miles de historias se pierden sin ser contadas.

Fotografías olvidadas

Cientos de miles de fotografías quedan enterradas en el tiempo.

Familias separadas

Los lazos familiares se pierden y las raíces quedan cortadas.

¿Qué es Humanidad?

El archivo vivo más grande de la historia.

Humanidad es un proyecto global dedicado a preservar la memoria de las personas, conectar generaciones y construir el archivo vivo más grande de la historia.

No se trata solamente de genealogía. Se trata de preservar vidas.

Archivo

Fotos, documentos y recuerdos, guardados en un solo lugar.

Memoria

Historias que siguen vivas y se transmiten al futuro.

Legado

Un valioso legado para las próximas generaciones.

Nuestra Historia

Todo comenzó
con una pregunta.

¿Qué pasaría si millones de historias desaparecieran para siempre?

Esa pregunta dio origen a Humanidad.

Fotografía de ambiente — Santiago escribiendo las primeras páginas del proyecto.

Santiago Torres, fundador
El viaje de una familia

Para cada familia, hay una historia que debe ser contada.

Descubrí los lazos y preservá tu historia para el futuro.

Ver el viaje familiar
AT
DM
ME
JC
GT
ST
ST
AT
MT
JT
AM
PM
LM
SM
ST
Santiago Torres
1994 —
Historia de vida
Fotos 12
Recuerdos 8
Lugares 5
Documentos 7
Ver más
El mapa vivo

Familias de todo el mundo, unidas en una sola red.

Del continente, al país, a la ciudad, hasta llegar a una historia familiar específica.

Explorar el mapa
Sudamérica
Paraguay
Ciudad del Este
Familia Torres
La constelación humana

Nacimos como estrellas.
Nos conectamos.
Y juntos formamos una forma.

Somos millones de historias.
Una sola Humanidad.

HUMANIDAD

El tiempo pasa, las historias continúan.

1920 Un nuevo comienzo
1944 Tiempos de resiliencia
1994 Una nueva generación
2026 El presente
2050 El horizonte
2100 Y el mañana

Dentro de cien años…
¿quién contará tu historia?

Acompañar Humanidad

Bienvenido a este camino.

Estamos construyendo este proyecto para las próximas generaciones. Si querés acompañar este camino desde el principio... bienvenido.

/* ---------- Acto 07: La Constelación Humana ---------- */ (function(){ const canvas = document.getElementById('constellationCanvas'); const ctx = canvas.getContext('2d'); const wordmarkEl = document.getElementById('constellationWordmark'); const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; let W, H, DPR; function resize(){ DPR = Math.min(window.devicePixelRatio || 1, 2); W = canvas.clientWidth; H = canvas.clientHeight; canvas.width = W * DPR; canvas.height = H * DPR; ctx.setTransform(DPR,0,0,DPR,0,0); } window.addEventListener('resize', resize); const FX = 500, FY = 470; function arcPoints(cx, cy, rx, ry, a0, a1, n, taper){ const pts = []; for(let i=0;i{ const s = Math.sin(t*Math.PI/180); return 1 - 0.28*Math.max(0,s); })}); features.push({closed:false, pts: arcPoints(FX-62,FY-78,30,10,200,340,7)}); features.push({closed:false, pts: arcPoints(FX+62,FY-78,30,10,200,340,7)}); features.push({closed:true, pts: arcPoints(FX-58,FY-32,27,13,0,360,16)}); features.push({closed:true, pts: arcPoints(FX+58,FY-32,27,13,0,360,16)}); features.push({closed:false, pts: [ {x:FX-4,y:FY-18},{x:FX-2,y:FY+10},{x:FX+2,y:FY+34}, {x:FX+16,y:FY+44},{x:FX+2,y:FY+48} ]}); features.push({closed:false, pts: (()=>{ const pts = []; const mrx=44, mry=13, mcx=FX, mcy=FY+94; for(let i=0;i<11;i++){ const xf = -1 + 2*(i/10); pts.push({x: mcx + xf*mrx, y: mcy + mry*(1 - xf*xf)}); } return pts; })()}); const anchors = []; features.forEach(f=>{ f.pts.forEach((p,i)=> anchors.push({x:p.x,y:p.y,feature:f,idx:i})); }); const STAR_COUNT = 420; const stars = []; for(let i=0;i1?1:(t<0.5 ? 4*t*t*t : 1-Math.pow(-2*t+2,3)/2); } function targetZoom(){ return Math.min(W,H) / 460; } let started = false, start = null; function render(elapsed){ ctx.clearRect(0,0,W,H); ctx.fillStyle = '#000'; ctx.fillRect(0,0,W,H); let camX, camY, zoom, revealFrac, lineAlphaFactor; if(elapsed < T_BUILD_END){ const bt = ease(elapsed / T_BUILD_END); revealFrac = bt; const firstA = anchors[0]; camX = firstA.x + (FX - firstA.x) * bt * 0.35; camY = firstA.y + (FY - firstA.y) * bt * 0.35; zoom = 9 - (9 - targetZoom()*2.2) * bt; lineAlphaFactor = bt; } else if(elapsed < T_ZOOM_END){ const zt = ease((elapsed - T_BUILD_END) / (T_ZOOM_END - T_BUILD_END)); revealFrac = 1; const firstA = anchors[0]; const midX = firstA.x + (FX - firstA.x) * 0.35; const midY = firstA.y + (FY - firstA.y) * 0.35; camX = midX + (FX - midX) * zt; camY = midY + (FY - midY) * zt; const midZoom = 9 - (9 - targetZoom()*2.2); zoom = midZoom + (targetZoom() - midZoom) * zt; lineAlphaFactor = 1; } else { revealFrac = 1; camX = FX; camY = FY; zoom = targetZoom(); lineAlphaFactor = 1; } const cx = W/2, cy = H/2; function toScreen(wx,wy){ return { x: cx + (wx - camX) * zoom, y: cy + (wy - camY) * zoom }; } const starsVisible = Math.floor(stars.length * Math.min(1, revealFrac*1.3)); for(let i=0;iW+20||p.y<-20||p.y>H+20) continue; const tw = 0.4 + 0.6*Math.abs(Math.sin(elapsed/1000*s.speed + s.tw)); const a = tw * Math.min(1,(revealFrac*1.3 - i/stars.length)*6); ctx.beginPath(); ctx.fillStyle = `rgba(199,164,104,${Math.max(0,Math.min(1,a))*0.8})`; ctx.arc(p.x,p.y, s.r*Math.min(1.4,zoom*0.12+0.4), 0, Math.PI*2); ctx.fill(); } const anchorsVisible = Math.floor(anchors.length * revealFrac); ctx.lineWidth = Math.max(0.6, zoom*0.045); features.forEach(f=>{ let prev = null; f.pts.forEach((p,i)=>{ const globalIndex = anchors.findIndex(a=>a.feature===f && a.idx===i); if(globalIndex >= anchorsVisible) { prev = null; return; } const sp = toScreen(p.x, p.y); if(prev){ ctx.beginPath(); ctx.strokeStyle = `rgba(199,164,104,${0.55*lineAlphaFactor})`; ctx.moveTo(prev.x, prev.y); ctx.lineTo(sp.x, sp.y); ctx.stroke(); } prev = sp; }); if(f.closed && anchorsVisible >= anchors.length){ const firstIdx = anchors.findIndex(a=>a.feature===f && a.idx===0); const lastIdx = anchors.findIndex(a=>a.feature===f && a.idx===f.pts.length-1); if(firstIdx= T_WORDMARK && wordmarkEl.style.opacity !== '1'){ if (typeof gsap !== 'undefined') { gsap.to(wordmarkEl, {opacity:1, duration:1.6, ease:'power2.out'}); } else { wordmarkEl.style.transition = 'opacity 1.6s ease'; wordmarkEl.style.opacity = '1'; } } } function frame(ts){ if(start === null) start = ts; const elapsed = ts - start; render(elapsed); requestAnimationFrame(frame); } function showFinalState(){ resize(); ctx.clearRect(0,0,W,H); ctx.fillStyle = '#000'; ctx.fillRect(0,0,W,H); wordmarkEl.style.opacity = '1'; } function begin(){ if(started) return; started = true; resize(); if(reducedMotion){ showFinalState(); return; } requestAnimationFrame(frame); } if (typeof ScrollTrigger !== 'undefined') { ScrollTrigger.create({ trigger: '#constellationSection', start: 'top 60%', once: true, onEnter: begin }); } else { const io = new IntersectionObserver((entries)=>{ entries.forEach(e=>{ if(e.isIntersecting){ begin(); io.unobserve(section); } }); }, {threshold:0.45}); io.observe(section); } })();