COPIED!
demo title: paths 2.0 demo link
HTML
<canvas id=c>
CSS
body, html{
  margin: 0;
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background: #000;
}
#c{
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  height: 100%;
  background: url(https://jsbot.cantelope.org/uploads/138BkZ.jpg);
  background-position: center center;
  background-size: fill;
  transform: translate(-50%, -50%);
}
 JavaScript
c=document.querySelector('#c')
x=c.getContext('2d')
S=Math.sin
C=Math.cos
t=playing=0
window.onclick=()=>{if(!playing)mp3.play()}
rsz=window.onresize=()=>{
  setTimeout(()=>{
    if(document.body.clientWidth > document.body.clientHeight*1.77777778){
      c.style.height = '100vh'
      setTimeout(()=>c.style.width = c.clientHeight*1.77777778+'px',0)
    }else{
      c.style.width = '100vw'
      setTimeout(()=>c.style.height = c.clientWidth/1.77777778 + 'px',0)
    }
    c.width=1920
    c.height=c.width/1.777777778
  },0)
}
rsz()
Draw=()=>{
  if(!t){
    Rn=Math.random
    R=(Rl,Pt,Yw,m)=>{X=S(p=(A=(M=Math).atan2)(X,Y)+Rl)*(d=(H=M.hypot)(X,Y)),Y=C(p)*d,Y=S(p=A(Y,Z)+Pt)*(d=H(Y,Z)),Z=C(p)*d,X=S(p=A(X,Z)+Yw)*(d=H(X,Z)),Z=C(p)*d;if(m)X+=oX,Y+=oY,Z+=oZ}
    Q=()=>[c.width/2+X/Z*600,c.height/2+Y/Z*600]
    I=(A,B,M,D,E,F,G,H)=>(K=((G-E)*(B-F)-(H-F)*(A-E))/(J=(H-F)*(M-A)-(G-E)*(D-B)))>=0&&K<=1&&(L=((M-A)*(B-F)-(D-B)*(A-E))/J)>=0&&L<=1?[A+K*(M-A),B+K*(D-B)]:0
    cl=9, G=60, sp=G/15, spd=1.25
    B=Array(cl).fill().map((v,i)=>{
      X=0
      Y=(i-cl/2)*sp
      Z=G
      return [[X,Y,Z]]
    })
    bgimg=new Image()
    bgimg.src='https://jsbot.cantelope.org/uploads/1EfTuQ.jpg'
  }
  x.lineJoin=x.lineCap='round'

  B=B.map((v,i)=>{
    X=v[l=v.length-1][0]
    Y=v[l][1]
    Z=G
    v.map(q=>{
      q[2]-=spd
    })
    X+=S((Rn()-.5)*4+(i+99+t/16)**2)*2
    //Y+=S(t/14)/20
    if(X<-G/2)X=-G/2
    if(X>G/2)X=G/2
    if(Y<-G/2)v[l][1]=G/2
    if(Y>G/2)v[l][1]=-G/2
    v.push([X,Y,Z])
    return v
  })

  x.globalAlpha=.3
  x.drawImage(bgimg,0,0,c.width,c.height)
  x.globalAlpha=1
  x.fillStyle='#0005'
  x.fillRect(0,0,c.width,c.height)

  Rl=S(t/6)*6;Pt=0;Yw=0
  oX=0,oY=0,oZ=0
  
  B=B.map((v,i)=>{
    v.map((q,j)=>{
      if(j){
        x.beginPath()
        X=v[j][0]
        Y=v[j][1]
        Z=v[j][2]
        R(Rl,Pt,Yw,1)
        if(Z>-10)x.lineTo(...Q())
        X=v[j-1][0]
        Y=v[j-1][1]
        Z=v[j-1][2]
        R(Rl,Pt,Yw,1)
        if(Z>-10)x.lineTo(...Q())
        x.lineWidth = Math.min(500,2e3/(1+Z**1.4))
        x.strokeStyle = `hsla(${Z*2-t*300+i/cl*360},99%,${100+S(Z/10+i*4+t*10)*70}%,.3)`
        x.stroke()
        x.lineWidth /= 8
        x.strokeStyle='#fff'
        x.stroke()
      }
    })
    v=v.filter(q=>{
      return q[2]>0
    })
    return v
  })

  t+=1/60
  requestAnimationFrame(Draw)
}
Draw()