           @ctx.scale(sprite.scale, sprite.scale)
           @ctx.strokeStyle = 'white'
           @renderArrow(dir.theta, @block)
-    sprite.animations = @animatePopIn(1, {x:sprite.x, y:sprite.y})
+      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)
-
-    @record_sprites.push(sprite)
     @sprites.push(sprite)
 
 

    @ctx.restore()

  animateSprites: (absolute_t) ->
    for sprite in @sprites
      do_next = true
      while do_next and sprite.animations.length > 0
        do_next = false
        anim = sprite.animations[0]

          # hit the end of the animation
          sprite.leftover_t = absolute_t - (anim.start_t + anim.duration)
          sprite.animations.shift()

          if anim.remove_on_finish
            remove = true
          else
            do_next = true

          if anim.lerp?
            for property in anim.lerp
