diff --git a/server_apps.go b/server_apps.go
index fe20e0cf30fb11e2de9e8c4599203534e1ecd7d4..ddedd333bb490ec602857af0b406ca8b8617658d 100644
--- a/server_apps.go
+++ b/server_apps.go
@@ -18,7 +18,7 @@ import (
 	"strings"
 	"strconv"
 	"time"
-    "math"
+	"math"
 
 	"github.com/go-git/go-git/v5"
 	"github.com/go-git/go-git/v5/config"
@@ -28,10 +28,21 @@ import (
 	"github.com/pelletier/go-toml/v2"
 )
 
+type appStyleFloatie struct {
+	Symbol  string  `json:"symbol"`
+	Color   string  `json:"color"`
+}
+
+type appStyle struct {
+	Background  string              `json:"background"`
+	Floaties    []appStyleFloatie   `json:"floaties"`
+}
+
 type appPatch struct{
-	repository string
-	zip       []byte
-	targz     []byte
+	version     int
+	repository  string
+	zip         []byte
+	targz       []byte
 }
 
 type appStatus struct{
@@ -62,6 +73,7 @@ type appInfo struct {
 	author      string
 	description string
 	version     int
+	slug        string
 	commit      string
 	stars       int
 	flow3rSeed  string
@@ -73,6 +85,7 @@ type appInfo struct {
 	firstErr error
 	tags    []string
 	status *appStatus
+	style *appStyle
 }
 
 type GLProject struct {
@@ -296,6 +309,7 @@ func (s *server) parseAppToml(ctx context.Context, pathInRepo string, obj *objec
 			Description string
 			Version     int
 		}
+		Style map[string]interface{}
 	}
 	dec := toml.NewDecoder(reader)
 	err = dec.Decode(&data)
@@ -329,7 +343,7 @@ func (s *server) parseAppToml(ctx context.Context, pathInRepo string, obj *objec
 		return nil, fmt.Errorf("metadata description too long (must be <= 140 chars)")
 	}
 
-	return &appInfo{
+	ret := appInfo{
 		name:        data.App.Name,
 		author:      data.Metadata.Author,
 		menu:        data.App.Category,
@@ -337,7 +351,37 @@ func (s *server) parseAppToml(ctx context.Context, pathInRepo string, obj *objec
 		version:     data.Metadata.Version,
 		commit:      obj.Hash.String(),
 		commitObj:   obj,
-	}, nil
+		style:      nil,
+	}
+
+	if col, ok := data.Style["background"].(string); ok {
+		style := appStyle{
+			Background: col,
+		}
+		if floaties, ok := data.Style["floaties"].([]interface{}); ok {
+			for x:=0; x<len(floaties); x++ {
+				floatie, ok := floaties[x].(map[string]interface{})
+				if !ok {
+					continue
+				}
+				col, ok := floatie["color"].(string)
+				if !ok {
+					continue
+				}
+				symbol, ok := floatie["symbol"].(string)
+				if !ok {
+					symbol = "flow3r"
+				}
+				f := appStyleFloatie{
+					Symbol: symbol,
+					Color: col,
+				}
+				style.Floaties = append(style.Floaties, f)
+			}
+		}
+		ret.style = &style
+	}
+	return &ret, nil
 }
 
 func (s *server) getAppInfo(ctx context.Context, pathInRepo, repo string, slug *string) (*appInfo, error) {
@@ -438,6 +482,8 @@ func (s *server) getAppInfo(ctx context.Context, pathInRepo, repo string, slug *
 	}
 	app.targz = tbytes
 
+	app.slug = strings.ReplaceAll(slug_str, "/", "-")
+
 	// Calculate an 8 digit flow3r seed which can be used to install the
 	// app.  This is based on md5 so ambitious hack3rs can force a certain
 	// app seed :)
@@ -617,6 +663,7 @@ func (s *server) getAppRegistry(ctx context.Context) (*appRegistry, error) {
 								repository: patch,
 								zip: patch_info.zip,
 								targz: patch_info.targz,
+								version: patch_info.version,
 							}
 						}
 					}
@@ -635,9 +682,10 @@ func (s *server) getAppRegistry(ctx context.Context) (*appRegistry, error) {
 }
 
 type jsonAppPatch struct{
-	RepoURL        string    `json:"repoUrl"`
-	DownloadURL    string    `json:"downloadUrl"`
-	TarDownloadURL string    `json:"tarDownloadUrl"`
+	Version        int      `json:"version"`
+	RepoURL        string   `json:"repoUrl"`
+	DownloadURL    string   `json:"downloadUrl"`
+	TarDownloadURL string   `json:"tarDownloadUrl"`
 }
 
 type jsonAppStatus struct{
@@ -657,10 +705,12 @@ type jsonApp struct {
 	Description    string    `json:"description"`
 	Version        int       `json:"version"`
 	Stars          int       `json:"stars"`
+	Slug           string    `json:"slug"`
 	Tags           []string  `json:"tags"`
 	Timestamp      time.Time `json:"timestamp"`
 	Flow3rSeed     string    `json:"flow3rSeed"`
-	Status          *jsonAppStatus  `json:"status"`
+	Status         *jsonAppStatus  `json:"status"`
+	Style          *appStyle       `json:"style"`
 }
 
 func makeJsonApp(a *appDescriptor) jsonApp {
@@ -678,6 +728,8 @@ func makeJsonApp(a *appDescriptor) jsonApp {
 		Stars:          a.appInfo.stars,
 		Flow3rSeed:     a.appInfo.flow3rSeed,
 		Tags:           a.appInfo.tags,
+		Slug:           a.appInfo.slug,
+		Style:          a.appInfo.style,
 	}
 	if a.appInfo.status != nil{
 		ret.Status = &jsonAppStatus{
@@ -690,6 +742,7 @@ func makeJsonApp(a *appDescriptor) jsonApp {
 				RepoURL:        "https://git.flow3r.garden/" + pa,
 				DownloadURL:    fmt.Sprintf("%sapps/zip/%s.zip", flagBaseURL, pa),
 				TarDownloadURL: fmt.Sprintf("%sapps/tar/%s.tar.gz", flagBaseURL, pa),
+				Version: a.appInfo.status.patch.version,
 			}
 		}
 	}