Matrix: orginize code
diff --git a/apps/matrix/capture-config/main.go b/apps/matrix/capture-config/main.go
new file mode 100644
index 0000000..b031fbb
--- /dev/null
+++ b/apps/matrix/capture-config/main.go
@@ -0,0 +1,58 @@
+package main
+
+import (
+	"context"
+	"flag"
+	"io/ioutil"
+	"path"
+
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/rest"
+)
+
+var configFile = flag.String("config", "", "Path to the homeserver.yaml config file.")
+var namespace = flag.String("namespace", "", "Namespace name.")
+var configMapName = flag.String("config-map-name", "", "Name of the ConfigMap to create.")
+
+func createClient() *kubernetes.Clientset {
+	config, err := rest.InClusterConfig()
+	if err != nil {
+		panic(err.Error())
+	}
+	cs, err := kubernetes.NewForConfig(config)
+	if err != nil {
+		panic(err.Error())
+	}
+	return cs
+}
+
+func createConfigFromFile() *v1.ConfigMap {
+	f, err := ioutil.ReadFile(*configFile)
+	if err != nil {
+		panic(err)
+	}
+	return &v1.ConfigMap{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       "ConfigMap",
+			APIVersion: "v1",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name: *configMapName,
+		},
+		Data: map[string]string{
+			path.Base(*configFile): string(f),
+		},
+	}
+}
+
+func main() {
+	flag.Parse()
+	config := createConfigFromFile()
+	client := createClient().CoreV1().ConfigMaps(*namespace)
+	_, err := client.Create(context.TODO(), config, metav1.CreateOptions{})
+	if err != nil {
+		panic(err)
+	}
+}