           # hit the end of the animation
           sprite.leftover_t = absolute_t - (anim.start_t + anim.duration)
           sprite.animations.shift()
-          do_next = true
+
+          if anim.remove_on_finish
+            remove = true
+          else
+            do_next = true
 
           if anim.lerp?
             for property in anim.lerp

                (property.v1 - property.v0) * t + property.v0

      sprite.leftover_t = 0

  isAnimating: () ->
    for sprite in @sprites

          @ctx.scale(sprite.scale, sprite.scale)
          @ctx.strokeStyle = 'white'
          @renderArrow(dir.theta, @block)
      animations: []

    while sprite.x > @record_dims.x + @record_dims.width
      sprite.x -= @record_dims.width
      sprite.y += @block

    @record_sprites.push(sprite)

    if @record_sprites.length == height * width
      for old_sprite in @record_sprites[0...width]
        old_sprite.animations = [
          duration: 125
          lerp: [ {name: 'scale', v0: 1, v1: 0},
                  {name: 'y', v1: @record_dims.y-@block} ]
          remove_on_finish: true
        ]
      for old_sprite,i in @record_sprites[width..]
        desty = @record_dims.y+(.5  + i//width)*@block + .5
        if old_sprite == sprite
          # this does a mix of pop in and scroll up
          sprite.animations.push(
            duration: 100
            lerp: [ {name: 'y', v0: sprite.y, v1: (desty-sprite.y)*(100/125)+sprite.y},
                    {name: 'scale', v0: 0, v1: 1.25}
                  ]
          )
          sprite.animations.push(
            duration: 25
            lerp: [ {name: 'y', v1: desty},
                    {name: 'scale', v1: 1}
                  ]
          )
        else
          old_sprite.animations.push(
            duration: 125
            lerp: [ {name: 'y', v1: desty} ]
          )
      @record_sprites = @record_sprites[width..]
    else
      sprite.animations = @animatePopIn(1, {x:sprite.x, y:sprite.y})


    @advanceNextRecordSprite(1)
    @sprites.push(sprite)


