diff --git a/.gitignore b/.gitignore
index f0e3bca..53af949 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,129 @@
-/target
-**/*.rs.bk
\ No newline at end of file
+
+# Created by https://www.gitignore.io/api/rust,macos,jetbrains+all
+# Edit at https://www.gitignore.io/?templates=rust,macos,jetbrains+all
+
+### JetBrains+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### JetBrains+all Patch ###
+# Ignores the whole .idea folder and all .iml files
+# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
+
+.idea/
+
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
+
+*.iml
+modules.xml
+.idea/misc.xml
+*.ipr
+
+# Sonarlint plugin
+.idea/sonarlint
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### Rust ###
+# Generated by Cargo
+# will have compiled files and executables
+**/target/**
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
+
+# End of https://www.gitignore.io/api/rust,macos,jetbrains+all
diff --git a/design/db.gv b/design/db.gv
new file mode 100644
index 0000000..8a10fd0
--- /dev/null
+++ b/design/db.gv
@@ -0,0 +1,71 @@
+digraph {
+ graph [pad="0.5", nodesep="0.5", ranksep="2"];
+ node [shape=plain]
+ rankdir=RL;
+
+ media [label=<
+
+ media |
+ id |
+ media_type_id |
+ display_name |
+ notes |
+
+ >];
+
+ media_name [label=<
+
+ media_name |
+ id |
+ media_id |
+ name |
+ language |
+
+ >];
+
+ # CD, DVD, etc.
+ media_format [label=<
+
+ media_format |
+ id |
+ physical |
+ format |
+
+ >];
+
+ media_format_link [label=<
+
+ media_format_link |
+ media_type_id |
+ media_format_id |
+
+ >]
+
+ # Video Game, Anime, Movie, TV Show
+ media_type [label=<
+
+ media_type |
+ id |
+ type |
+
+ >];
+
+ media_type_format_link [label=<
+
+ media_type_format_link |
+ media_type_id |
+ media_format_id |
+
+ >]
+
+ media_type_format_link:media_type_id -> media_type:id
+ media_type_format_link:media_format_id -> media_format:id
+
+ media:media_type_id -> media_type:id
+
+ media_name:media_id -> media:id
+
+ media_format_link:media_id -> media:id
+ media_format_link:media_format_id -> media_format:id
+
+}
diff --git a/design/media-collection-tree.gv b/design/media-collection-tree.gv
new file mode 100644
index 0000000..cb97a9b
--- /dev/null
+++ b/design/media-collection-tree.gv
@@ -0,0 +1,7 @@
+digraph objectTree {
+ media_type -> media
+ media_type -> media_format
+
+ media_format -> media
+ media -> media_name
+}