diff --git a/server_apps.go b/server_apps.go
index 5cd2859d6cbaab09cb3bc2372e2608f7b20652cb..c5ede95057dfeae507088bddeb9ef4d8f3daaaeb 100644
--- a/server_apps.go
+++ b/server_apps.go
@@ -165,22 +165,35 @@ func (s *server) targzApp(ctx context.Context, name, pathInRepo, repo string, ob
 		prefix = strings.ReplaceAll(repo, "/", "-")
 		outPath := path.Join(prefix, p)
 
+		ensureDir := func(p string) error {
+			if directories[p] {
+				return nil
+			}
+			directories[p] = true
+			err = t.WriteHeader(&tar.Header{
+				Name:     p,
+				Typeflag: tar.TypeDir,
+				Mode:     0755,
+			})
+			if err != nil {
+				return fmt.Errorf("CreateDir(%q): %w", p, err)
+			}
+			return nil
+		}
+
 		dirs, _ := path.Split(outPath)
 		if dirs != "" {
+			dirs = strings.TrimRight(dirs, "/")
 			parts := strings.Split(dirs, "/")
-			cur := parts[0]
+			cur := parts[0] + "/"
+
+			if err := ensureDir(cur); err != nil {
+				return nil, err
+			}
 			for i := 1; i < len(parts); i++ {
-				cur += parts[i]
-				if !directories[cur] {
-					directories[cur] = true
-					err = t.WriteHeader(&tar.Header{
-						Name:     cur + "/",
-						Typeflag: tar.TypeDir,
-						Mode:     0755,
-					})
-					if err != nil {
-						return nil, fmt.Errorf("CreateDir(%q): %w", cur, err)
-					}
+				cur += parts[i] + "/"
+				if err := ensureDir(cur); err != nil {
+					return nil, err
 				}
 			}
 		}
@@ -365,9 +378,9 @@ func (s *server) getAppInfo(ctx context.Context, pathInRepo, repo string) (*appI
 	// app.  This is based on md5 so ambitious hack3rs can force a certain
 	// app seed :)
 	flow3rSeedMd5 := md5.Sum([]byte(repo))
-	app.flow3rSeed = "";
+	app.flow3rSeed = ""
 	for i := 0; i < 8; i++ {
-		app.flow3rSeed += string(flow3rSeedMd5[i] % 5 + byte('0'))
+		app.flow3rSeed += string(flow3rSeedMd5[i]%5 + byte('0'))
 	}
 
 	return app, nil
@@ -481,8 +494,8 @@ type jsonApp struct {
 	Flow3rSeed     string `json:"flow3rSeed"`
 }
 
-func makeJsonApp(a *appDescriptor) (jsonApp) {
-	return jsonApp {
+func makeJsonApp(a *appDescriptor) jsonApp {
+	return jsonApp{
 		RepoURL:        "https://git.flow3r.garden/" + a.repository,
 		Commit:         a.appInfo.commit,
 		DownloadURL:    fmt.Sprintf("%sapps/zip/%s.zip", flagBaseURL, a.repository),