diff --git a/android/gradle.properties b/android/gradle.properties
index db7a1ee2908d6e94aeb319e1c1b548a8bb245891..14eed3944b547f02179b1b42f4b601f91b7957c0 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.3
-app.versionCode=3
+app.versionName=0.0.4
+app.versionCode=4
diff --git a/fastlane/metadata/android/en-US/changelogs/4.txt b/fastlane/metadata/android/en-US/changelogs/4.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f2bbe1dded183a838260f63dc98822ac08860e6d
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/4.txt
@@ -0,0 +1 @@
+Add animations.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/4.txt b/fastlane/metadata/android/fr-FR/changelogs/4.txt
new file mode 100644
index 0000000000000000000000000000000000000000..53426e44d37ab11fcad84471519021b3684903dc
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/4.txt
@@ -0,0 +1 @@
+Ajout d'animations.
diff --git a/lib/cubit/game_cubit.dart b/lib/cubit/game_cubit.dart
index ecc7b78a2c63a4f5b05fcfd891612c85028affff..658258bd7630e321c40720341eef8cf01d0deaf1 100644
--- a/lib/cubit/game_cubit.dart
+++ b/lib/cubit/game_cubit.dart
@@ -1,3 +1,5 @@
+import 'dart:async';
+
 import 'package:equatable/equatable.dart';
 import 'package:flutter/material.dart';
 import 'package:hydrated_bloc/hydrated_bloc.dart';
@@ -36,6 +38,7 @@ class GameCubit extends HydratedCubit<GameState> {
       // Game data
       currentPlayer: state.currentGame.currentPlayer,
       scores: state.currentGame.scores,
+      currentHand: state.currentGame.currentHand,
     );
     // game.dump();
 
@@ -79,7 +82,7 @@ class GameCubit extends HydratedCubit<GameState> {
     refresh();
   }
 
-  void tapOnCell(int cellIndex) {
+  void tapOnCell(int cellIndex) async {
     printlog('tapOnCell: $cellIndex');
 
     if (!state.currentGame.isCurrentPlayerHouse(cellIndex)) {
@@ -103,7 +106,7 @@ class GameCubit extends HydratedCubit<GameState> {
     state.currentGame.animationInProgress = true;
     refresh();
 
-    final int lastCellIndex = animateSeedsDistribution(cellIndex);
+    final int lastCellIndex = await animateSeedsDistribution(cellIndex);
     animateSeedsEarning(lastCellIndex);
 
     toggleCurrentPlayer();
@@ -118,21 +121,26 @@ class GameCubit extends HydratedCubit<GameState> {
     refresh();
   }
 
-  int animateSeedsDistribution(int sourceCellIndex) {
+  Future<int> animateSeedsDistribution(int sourceCellIndex) async {
     printlog('animateSeedsDistribution / sourceCellIndex: $sourceCellIndex');
 
     final int seedsCount = state.currentGame.board.cells[sourceCellIndex];
 
     // empty source cell
-    state.currentGame.board.cells[sourceCellIndex] = 0;
     printlog('animateSeedsDistribution / empty source cell');
+    state.currentGame.board.cells[sourceCellIndex] = 0;
+    state.currentGame.currentHand = seedsCount;
     refresh();
 
+    await Future.delayed(const Duration(milliseconds: 500));
+
     int cellIndex = sourceCellIndex;
     for (int i = 0; i < seedsCount; i++) {
       cellIndex = state.currentGame.getNextCellIndex(cellIndex, sourceCellIndex);
+      state.currentGame.currentHand--;
       state.currentGame.board.cells[cellIndex] += 1;
       refresh();
+      await Future.delayed(const Duration(milliseconds: 500));
     }
 
     refresh();
@@ -140,7 +148,7 @@ class GameCubit extends HydratedCubit<GameState> {
     return cellIndex;
   }
 
-  void animateSeedsEarning(int lastCellIndex) {
+  void animateSeedsEarning(int lastCellIndex) async {
     printlog('animateSeedsEarning / lastCellIndex: $lastCellIndex');
 
     if (state.currentGame.isOpponentHouse(lastCellIndex)) {
@@ -154,6 +162,8 @@ class GameCubit extends HydratedCubit<GameState> {
         state.currentGame.scores[state.currentGame.currentPlayer] += seedsCount;
         refresh();
 
+        await Future.delayed(const Duration(milliseconds: 500));
+
         // (recursively) check previous cells
         printlog('-> dispatch to previous cell');
         animateSeedsEarning(state.currentGame.getPreviousCellIndex(lastCellIndex));
diff --git a/lib/models/game/game.dart b/lib/models/game/game.dart
index 74288db3b8be68459d82c99a3dbefc1c25fbbd60..e82535e7ba1e7a63f64c334281542ceb7e740527 100644
--- a/lib/models/game/game.dart
+++ b/lib/models/game/game.dart
@@ -21,6 +21,7 @@ class Game {
     // Game data
     required this.currentPlayer,
     required this.scores,
+    required this.currentHand,
   });
 
   // Settings
@@ -39,6 +40,7 @@ class Game {
   // Game data
   int currentPlayer;
   List<int> scores;
+  int currentHand;
 
   factory Game.createNull() {
     return Game(
@@ -50,6 +52,7 @@ class Game {
       // Game data
       currentPlayer: 0,
       scores: [0, 0],
+      currentHand: 0,
     );
   }
 
@@ -78,6 +81,7 @@ class Game {
       // Game data
       currentPlayer: 0,
       scores: [0, 0],
+      currentHand: 0,
     );
   }
 
diff --git a/lib/ui/widgets/game/game_board.dart b/lib/ui/widgets/game/game_board.dart
index d8273bf5478c6b4af7a008929a4cf193678de9e1..3fb64abd85ed520447578a6249337c2a7c9951d1 100644
--- a/lib/ui/widgets/game/game_board.dart
+++ b/lib/ui/widgets/game/game_board.dart
@@ -40,6 +40,7 @@ class GameBoardWidget extends StatelessWidget {
             children: [
               GamePlayerWidget(
                 active: !currentGame.isFinished && currentGame.currentPlayer == 0,
+                seeds: currentGame.currentPlayer == 0 ? currentGame.currentHand : 0,
               ),
               Container(
                 margin: const EdgeInsets.all(2),
@@ -96,6 +97,7 @@ class GameBoardWidget extends StatelessWidget {
               ),
               GamePlayerWidget(
                 active: !currentGame.isFinished && currentGame.currentPlayer == 1,
+                seeds: currentGame.currentPlayer == 1 ? currentGame.currentHand : 0,
               ),
             ],
           );
diff --git a/lib/ui/widgets/game/game_player.dart b/lib/ui/widgets/game/game_player.dart
index fa1f9dc766765f63bf8215b6e5fc770fe04ae32d..5d2a9452b41df37f647ad19388d9b18f72d5e6b5 100644
--- a/lib/ui/widgets/game/game_player.dart
+++ b/lib/ui/widgets/game/game_player.dart
@@ -4,9 +4,11 @@ class GamePlayerWidget extends StatelessWidget {
   const GamePlayerWidget({
     super.key,
     required this.active,
+    required this.seeds,
   });
 
   final bool active;
+  final int seeds;
 
   @override
   Widget build(BuildContext context) {
@@ -25,7 +27,15 @@ class GamePlayerWidget extends StatelessWidget {
       ),
       width: 100,
       height: 100,
-      child: const SizedBox.shrink(),
+      child: Text(
+        seeds == 0 ? '' : seeds.toString(),
+        textAlign: TextAlign.center,
+        style: TextStyle(
+          fontSize: 40,
+          fontWeight: FontWeight.bold,
+          color: Theme.of(context).colorScheme.primary,
+        ),
+      ),
     );
   }
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index bf03338c9cbc32b227e8ad2b4e3ae2e053b12b4d..c1462bdb4b4b1956b5b91eae0d3051c47f80c5ac 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Awale game
 
 publish_to: "none"
 
-version: 0.0.3+3
+version: 0.0.4+4
 
 environment:
   sdk: "^3.0.0"