diff --git a/.gitignore b/.gitignore
index cdf3587bb50088283fbc05c8c363741c902e2be8..57c87e13ef2d33c4f526de9c2b3549362f0f1b41 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
 /logs
 
 media-repo.yaml
+homeserver.yaml
 
 vendor/pkg
 vendor/src
diff --git a/src/github.com/turt2live/matrix-media-repo/cmd/import_synapse/main.go b/src/github.com/turt2live/matrix-media-repo/cmd/import_synapse/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..1103202f63d06e632dc1654369ea0ef9eb19d04d
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/cmd/import_synapse/main.go
@@ -0,0 +1,37 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+
+	"github.com/turt2live/matrix-media-repo/config"
+	"github.com/turt2live/matrix-media-repo/storage"
+	"github.com/turt2live/matrix-media-repo/synapse"
+)
+
+func main() {
+	c, err := config.ReadConfig()
+	if err != nil {
+		panic(err)
+	}
+
+	db, err := storage.OpenDatabase(c.Database.Postgres)
+	if err != nil {
+		panic(err)
+	}
+
+	homeserverYamlPath := flag.String("homeserver", "homeserver.yaml", "Path to your homeserver.yaml")
+	moveFiles := flag.Bool("move", false, "If set, files will be moved instead of copied")
+	importRemote := flag.Bool("remote", false, "If set, remote media will also be imported")
+	flag.Parse()
+
+	hsConfig, err := synapse.ReadConfig(*homeserverYamlPath)
+	if err != nil {
+		panic(err)
+	}
+
+	fmt.Println(*moveFiles)
+	fmt.Println(*importRemote)
+	fmt.Println(*db)
+	fmt.Println(hsConfig.GetConnectionString())
+}
\ No newline at end of file
diff --git a/src/github.com/turt2live/matrix-media-repo/synapse/homeserver_yaml.go b/src/github.com/turt2live/matrix-media-repo/synapse/homeserver_yaml.go
new file mode 100644
index 0000000000000000000000000000000000000000..8dfc9fb964b2e1c6dc55bbd68879c465c2decb63
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/synapse/homeserver_yaml.go
@@ -0,0 +1,50 @@
+package synapse
+
+import (
+	"errors"
+	"io/ioutil"
+	"os"
+
+	"gopkg.in/yaml.v2"
+)
+
+type HomeserverYaml struct {
+	Database struct {
+		Name string `yaml:"name"`
+		Arguments struct {
+			Username string `yaml:"user"`
+			Password string `yaml:"password"`
+			Database string `yaml:"database"`
+			Hostname string `yaml:"host"`
+		} `yaml:"args"`
+	} `yaml:"database"`
+}
+
+func ReadConfig(yamlPath string) (HomeserverYaml, error) {
+	c := &HomeserverYaml{}
+
+	f, err := os.Open(yamlPath)
+	if err != nil {
+		return *c, err
+	}
+
+	defer f.Close()
+
+	buffer, err := ioutil.ReadAll(f)
+	err = yaml.Unmarshal(buffer, &c)
+	if err != nil {
+		return *c, err
+	}
+
+	return *c, nil
+}
+
+func (c *HomeserverYaml) GetConnectionString() (string) {
+	if c.Database.Name != "psycopg2" {
+		panic(errors.New("homeserver database must be postgres"))
+	}
+
+	a := c.Database.Arguments
+
+	return "postgres://" + a.Username + ":" + a.Password + "@" + a.Hostname + "/" + a.Database + "?sslmode=disable"
+}
\ No newline at end of file