 		if funny?
 			Dom.div !->
 				Dom.animate
-            			create:
-            				opacity: 1 # target
-            				initial:
-                  				opacity: 0
-            			remove:
-            				opacity: 0 # target
-            				initial:
-                  				opacity: 1
-            			content: !->
+						create:
+							opacity: 1 # target
+							initial:
+								opacity: 0
+						remove:
+							opacity: 0 # target
+							initial:
+								opacity: 1
+						content: !->
 						Dom.style fontSize: '150%', textAlign: 'center', padding: "30px 5px 15px"
 						Dom.text funny
 
-renderScores = (buffer) !->
+renderScores = (localScores) !->
+	done = Obs.create true
+
+	# make a list of all the player ids
+	playerList = Obs.create {}
+	Obs.observe !->
+		Db.shared.iterate 'counters', (counter) !->
+			userId = + counter.key()
+			return if userId is App.userId()
+			playerList.set userId, true
+
+	# animate scores when receiving someone's buffered clicks
+	playerList.iterate (userId) !->
+		done.get() # subscribe
+
+		realCounter = Db.shared.ref('counters', userId.key())
+		localCounter = localScores.ref('counters', userId.key())
+		diff = realCounter.get() - localCounter.peek()
+		return if diff is 0
+		done.set false
+		stepTime = Math.round(BUFFER_TIME/diff)
+		Obs.interval stepTime, !->
+			localCounter.incr()
+			if realCounter.peek() <= localCounter.peek()
+				done.set true
+
 	Ui.list !->
 		Dom.style margin: '0 15px'
-		Db.shared.iterate 'counters',
-			((counter) !-> renderScore(counter, buffer)),
-			(counter) -> -(counter.get() + if (counter.key() is App.userId()) then buffer.get() else 0)
+		localScores.iterate 'counters', renderScore, (counter) -> -counter.get()
 
-renderScore = (counter, buffer) !->
+renderScore = (counter) !->
 	Ui.item !->
 		userId = +counter.key()
 		if userId is App.userId()

			Dom.style marginLeft: '10px', Flex: 1
			Dom.text App.userName(userId)
		Dom.div !->
			if userId is App.userId()
				Dom.text counter.get() + buffer.get()
			else
				Dom.text counter.get()


	Obs.observe !->
		return unless buffering.get()
		Obs.onTime BUFFER_TIME, !->
			bufferedClicks = buffer.peek()
			buffer.set(0)

