diff --git a/snapshot.bin b/snapshot.bin
new file mode 100644
index 0000000000000000000000000000000000000000..e40ce8ea6736cebfda287ac64e4fbfb920be0f96
Binary files /dev/null and b/snapshot.bin differ
diff --git a/tools/genesis-snapshot/main.go b/tools/genesis-snapshot/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..1a887e139ba8e606516899e781401e2700361de0
--- /dev/null
+++ b/tools/genesis-snapshot/main.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+	"log"
+	"os"
+
+	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance"
+	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/tangle"
+	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
+	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/wallet"
+	flag "github.com/spf13/pflag"
+	"github.com/spf13/viper"
+)
+
+const (
+	cfgGenesisTokenAmount   = "token-amount"
+	cfgSnapshotFileName     = "snapshot-file"
+	defaultSnapshotFileName = "./snapshot.bin"
+)
+
+func init() {
+	flag.Int(cfgGenesisTokenAmount, 1000000000000000, "the amount of tokens to add to the genesis output")
+	flag.String(cfgSnapshotFileName, defaultSnapshotFileName, "the name of the generated snapshot file")
+}
+
+func main() {
+	flag.Parse()
+	if err := viper.BindPFlags(flag.CommandLine); err != nil {
+		panic(err)
+	}
+	genesisTokenAmount := viper.GetInt64(cfgGenesisTokenAmount)
+	snapshotFileName := viper.GetString(cfgSnapshotFileName)
+	log.Printf("creating snapshot %s...", snapshotFileName)
+
+	genesisWallet := wallet.New()
+	genesisAddress := genesisWallet.Seed().Address(0)
+
+	log.Println("genesis:")
+	log.Printf("-> seed (base58): %s", genesisWallet.Seed().String())
+	log.Printf("-> output address (base58): %s", genesisAddress.String())
+	log.Printf("-> output id (base58): %s", transaction.NewOutputID(genesisAddress, transaction.GenesisID))
+	log.Printf("-> token amount: %d", genesisTokenAmount)
+
+	snapshot := tangle.Snapshot{
+		transaction.GenesisID: {
+			genesisAddress: {
+				balance.New(balance.ColorIOTA, genesisTokenAmount),
+			},
+		},
+	}
+
+	f, err := os.OpenFile(snapshotFileName, os.O_RDWR|os.O_CREATE, 0666)
+	if err != nil {
+		log.Fatal("unable to create snapshot file", err)
+	}
+	defer f.Close()
+
+	if _, err = snapshot.WriteTo(f); err != nil {
+		log.Fatal("unable to write snapshot content to file", err)
+	}
+
+	log.Printf("created %s, bye", snapshotFileName)
+}