diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
new file mode 100644
index 0000000..0371a9d
--- /dev/null
+++ b/.github/workflows/gh-pages.yml
@@ -0,0 +1,31 @@
+name: GitHub Pages
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+jobs:
+ deploy:
+ runs-on: ubuntu-22.04
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - name: Setup Hugo
+ uses: peaceiris/actions-hugo@v2
+ with:
+ hugo-version: "latest"
+ # extended: true
+
+ - name: Build
+ run: hugo --minify
+
+ - name: Deploy
+ uses: peaceiris/actions-gh-pages@v3
+ if: github.ref == 'refs/heads/main'
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./public
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..86c95ef
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+# Generated files by hugo
+/public/
+/resources/_gen/
+/assets/jsconfig.json
+hugo_stats.json
+
+# Executable may be added to repository
+hugo.exe
+hugo.darwin
+hugo.linux
+
+# Temporary lock file while building
+/.hugo_build.lock
diff --git a/archetypes/default.md b/archetypes/default.md
new file mode 100644
index 0000000..00e77bd
--- /dev/null
+++ b/archetypes/default.md
@@ -0,0 +1,6 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+draft: true
+---
+
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..ddd760c
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,61 @@
+baseURL = "http://jointakahe.org/"
+languageCode = "en-us"
+title = "Takahē"
+theme = "cayman"
+
+# Syntax highlighting
+pygmentsCodefences = true
+pygmentsStyle = "pygments"
+
+[params]
+ # Header text, can be markdown
+ project_name = "Takahē"
+ project_tagline = "An efficient ActivityPub Server, for small installs with multiple domains"
+
+ # Date format for post list and single pages
+ # For more date formats see https://gohugo.io/functions/format/
+ dateFormat = "2006-01-02"
+
+ # Footer text, can be markdown
+ footer = "Theme based on [Cayman](https://github.com/zwbetz-gh/cayman-hugo-theme)"
+
+ # If true, the CSS/JS for Katex math typesetting are enabled
+ katex = true
+
+ # Breakpoints
+ large_breakpoint = "64em"
+ medium_breakpoint = "42em"
+
+ # Header colors
+ header_heading_color = "#fff"
+ header_background_color = "#26323c"
+ header_background_color_secondary = "#27343e"
+
+ # Text colors
+ section_headings_color = "#159957"
+ body_text_color = "#606c71"
+ body_link_color = "#1e6bb8"
+ blockquote_text_color = "#819198"
+
+ # Code colors
+ code_background_color = "#f3f6fa"
+ code_text_color = "#567482"
+
+ # Border colors
+ border_color = "#dce6f0"
+ table_border_color = "#e9ebec"
+ hr_border_color = "#eff0f1"
+
+[menu]
+ [[menu.nav]]
+ name = "GitHub"
+ url = "https://github.com/andrewgodwin/takahe"
+ weight = 1
+ [[menu.nav]]
+ name = "About"
+ url = "/about/"
+ weight = 3
+ [[menu.nav]]
+ name = "takahe.social"
+ url = "https://takahe.social"
+ weight = 4
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..332cbde
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,15 @@
+---
+title: Welcome
+---
+
+Takahē is a new ActivityPub server, designed for efficient use on *small- to*
+*medium-size* installations, and which allows you to host *multiple domains* on
+the same infrastructure.
+
+It's currently in an alpha state, meaning things work (and it will talk
+ActivityPub to Mastodon and other servers), but there's still a lot of features
+left to add.
+
+The flagship instance can be found at [takahe.social](http://takahe.social),
+and if you're interested, you can also [read more about the project](/about/),
+or read some of [Andrew's blogs on building it](https://aeracode.org/category/takahe).
diff --git a/content/about/index.md b/content/about/index.md
new file mode 100644
index 0000000..987e5a2
--- /dev/null
+++ b/content/about/index.md
@@ -0,0 +1,35 @@
+---
+title: About Takahē
+---
+
+Takahē is an ActivityPub server focused on microblogging, much like Mastodon,
+Pleroma, and others. Our goals are:
+
+* Allowing multiple domains on the same server ("virtual hosting")
+* Efficient, stable background tasks via asynchronous state machines
+* A default fast, low-JavaScript web interface
+* Mastodon Client API compatibility (eventually!)
+
+
+## Why start another server?
+
+The main motivation was to prove two things - that virtual hosting of multiple
+domains on a single ActivityPub server was possible (so you don't need
+to run a whole new server for every person or organisation that brings their
+own domain), and to explore the use of Python's asynchronous libraries to
+speed up the large amount of background work ActivityPub involves.
+
+Fortunately, both of those have proved themselves to work well in the initial
+build-out phase, and so now development is focused towards a small, reliable,
+stable release.
+
+While we do not expect to grow as large and featureful as Mastodon, the goal
+is to provide a smaller, lighter-weight server that is useful for small- to
+medium-size instances. The architecture we've chosen is deliberately easy to
+run and maintain but will not scale to a large install, and that's fine.
+
+## More Insight
+
+Takahē is, so far, mostly authored by [Andrew Godwin](https://aeracode.org/),
+and you can read more about its development, choices made, and progress via
+[my blog posts](https://aeracode.org/category/takahe).
diff --git a/content/posts/welcome.md b/content/posts/welcome.md
new file mode 100644
index 0000000..6b4353c
--- /dev/null
+++ b/content/posts/welcome.md
@@ -0,0 +1,6 @@
+---
+title: "Welcome"
+date: 2022-11-19T08:51:26-07:00
+---
+
+Hello!
diff --git a/static/.well-known/webfinger b/static/.well-known/webfinger
new file mode 100644
index 0000000..f39db67
--- /dev/null
+++ b/static/.well-known/webfinger
@@ -0,0 +1 @@
+{"subject": "acct:takahe@jointakahe.org", "aliases": ["https://jointakahe.takahe.social/@takahe/"], "links": [{"rel": "http://webfinger.net/rel/profile-page", "type": "text/html", "href": "https://jointakahe.takahe.social/@takahe/"}, {"rel": "self", "type": "application/activity+json", "href": "https://jointakahe.takahe.social/@takahe@jointakahe.org/"}]}
diff --git a/static/logo-1024.png b/static/logo-1024.png
new file mode 100644
index 0000000..5354bc3
Binary files /dev/null and b/static/logo-1024.png differ
diff --git a/static/logo.svg b/static/logo.svg
new file mode 100644
index 0000000..45cf635
--- /dev/null
+++ b/static/logo.svg
@@ -0,0 +1,145 @@
+
+
+
+
diff --git a/themes/cayman/archetypes/default.md b/themes/cayman/archetypes/default.md
new file mode 100644
index 0000000..d677d28
--- /dev/null
+++ b/themes/cayman/archetypes/default.md
@@ -0,0 +1,6 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+tags: []
+---
+
diff --git a/themes/cayman/assets/scss/cayman.scss b/themes/cayman/assets/scss/cayman.scss
new file mode 100644
index 0000000..c05c21c
--- /dev/null
+++ b/themes/cayman/assets/scss/cayman.scss
@@ -0,0 +1,376 @@
+// Breakpoints
+$large-breakpoint: {{ $.Site.Params.large_breakpoint | default "64em" }} !default;
+$medium-breakpoint: {{ $.Site.Params.medium_breakpoint | default "42em" }} !default;
+
+// Headers
+$header-heading-color: {{ $.Site.Params.header_heading_color | default "#fff" }} !default;
+$header-bg-color: {{ $.Site.Params.header_background_color | default "#159957" }} !default;
+$header-bg-color-secondary: {{ $.Site.Params.header_background_color_secondary | default "#155799" }} !default;
+
+// Text
+$section-headings-color: {{ $.Site.Params.section_headings_color | default "#159957" }} !default;
+$body-text-color: {{ $.Site.Params.body_text_color | default "#606c71" }} !default;
+$body-link-color: {{ $.Site.Params.body_link_color | default "#1e6bb8" }} !default;
+$blockquote-text-color: {{ $.Site.Params.blockquote_text_color | default "#819198" }} !default;
+
+// Code
+$code-bg-color: {{ $.Site.Params.code_background_color | default "#f3f6fa" }} !default;
+$code-text-color: {{ $.Site.Params.code_text_color | default "#567482" }} !default;
+
+// Borders
+$border-color: {{ $.Site.Params.border_color | default "#dce6f0" }} !default;
+$table-border-color: {{ $.Site.Params.table_border_color | default "#e9ebec" }} !default;
+$hr-border-color: {{ $.Site.Params.hr_border_color | default "#eff0f1" }} !default;
+
+@mixin large {
+ @media screen and (min-width: #{$large-breakpoint}) {
+ @content;
+ }
+}
+
+@mixin medium {
+ @media screen and (min-width: #{$medium-breakpoint}) and (max-width: #{$large-breakpoint}) {
+ @content;
+ }
+}
+
+@mixin small {
+ @media screen and (max-width: #{$medium-breakpoint}) {
+ @content;
+ }
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ padding: 0;
+ margin: 0;
+ font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 1.5;
+ color: $body-text-color;
+}
+
+a {
+ color: $body-link-color;
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ }
+}
+
+.btn {
+ display: inline-block;
+ margin-bottom: 1rem;
+ color: rgba(255, 255, 255, 0.7);
+ background-color: rgba(255, 255, 255, 0.08);
+ border-color: rgba(255, 255, 255, 0.2);
+ border-style: solid;
+ border-width: 1px;
+ border-radius: 0.3rem;
+ transition: color 0.2s, background-color 0.2s, border-color 0.2s;
+
+ &:hover {
+ color: rgba(255, 255, 255, 0.8);
+ text-decoration: none;
+ background-color: rgba(255, 255, 255, 0.2);
+ border-color: rgba(255, 255, 255, 0.3);
+ }
+
+ + .btn {
+ margin-left: 1rem;
+ }
+
+ @include large {
+ padding: 0.75rem 1rem;
+ }
+
+ @include medium {
+ padding: 0.6rem 0.9rem;
+ font-size: 0.9rem;
+ }
+
+ @include small {
+ padding: 0.75rem;
+ font-size: 0.9rem;
+ }
+}
+
+.page-header {
+ color: $header-heading-color;
+ text-align: center;
+ background-color: $header-bg-color;
+ background-image: linear-gradient(120deg, $header-bg-color-secondary, $header-bg-color);
+
+ @include large {
+ padding: 5rem 6rem;
+ }
+
+ @include medium {
+ padding: 3rem 4rem;
+ }
+
+ @include small {
+ padding: 2rem 1rem;
+ }
+}
+
+.project-name {
+ margin-top: 0;
+ margin-bottom: 0.1rem;
+
+ @include large {
+ font-size: 3.25rem;
+ }
+
+ @include medium {
+ font-size: 2.25rem;
+ }
+
+ @include small {
+ font-size: 1.75rem;
+ }
+}
+
+.project-name img {
+
+ @include large {
+ max-width: 600px;
+ }
+
+ @include medium {
+ max-width: 400px;
+ }
+
+ @include small {
+ max-width: 400px;
+ }
+}
+
+.project-tagline {
+ margin-bottom: 2rem;
+ font-weight: normal;
+ opacity: 0.7;
+
+ @include large {
+ font-size: 1.25rem;
+ }
+
+ @include medium {
+ font-size: 1.15rem;
+ }
+
+ @include small {
+ font-size: 1rem;
+ }
+}
+
+.main-content {
+ word-wrap: break-word;
+
+ :first-child {
+ margin-top: 0;
+ }
+
+ @include large {
+ max-width: 64rem;
+ padding: 2rem 6rem;
+ margin: 0 auto;
+ font-size: 1.1rem;
+ }
+
+ @include medium {
+ padding: 2rem 4rem;
+ font-size: 1.1rem;
+ }
+
+ @include small {
+ padding: 2rem 1rem;
+ font-size: 1rem;
+ }
+
+ img {
+ max-width: 100%;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+ font-weight: normal;
+ color: $section-headings-color;
+ }
+
+ p {
+ margin-bottom: 1em;
+ }
+
+ code {
+ padding: 2px 4px;
+ font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ font-size: 0.9em;
+ color: $code-text-color;
+ background-color: $code-bg-color;
+ border-radius: 0.3rem;
+ }
+
+ pre {
+ padding: 0.8rem;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ color: $code-text-color;
+ word-wrap: normal;
+ background-color: $code-bg-color;
+ border: solid 1px $border-color;
+ border-radius: 0.3rem;
+
+ > code {
+ padding: 0;
+ margin: 0;
+ font-size: 0.9rem;
+ color: $code-text-color;
+ word-break: normal;
+ white-space: pre;
+ background: transparent;
+ border: 0;
+ }
+ }
+
+ .highlight {
+ margin-bottom: 1rem;
+
+ pre {
+ margin-bottom: 0;
+ word-break: normal;
+ }
+ }
+
+ .highlight pre,
+ pre {
+ padding: 0.8rem;
+ overflow: auto;
+ font-size: 0.9rem;
+ line-height: 1.45;
+ border-radius: 0.3rem;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ pre code,
+ pre tt {
+ display: inline;
+ max-width: initial;
+ padding: 0;
+ margin: 0;
+ overflow: initial;
+ line-height: inherit;
+ word-wrap: normal;
+ background-color: transparent;
+ border: 0;
+
+ &:before,
+ &:after {
+ content: normal;
+ }
+ }
+
+ ul,
+ ol {
+ margin-top: 0;
+ }
+
+ blockquote {
+ padding: 0 1rem;
+ margin-left: 0;
+ color: $blockquote-text-color;
+ border-left: 0.3rem solid $border-color;
+
+ > :first-child {
+ margin-top: 0;
+ }
+
+ > :last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ table {
+ display: block;
+ width: 100%;
+ overflow: auto;
+ word-break: normal;
+ word-break: keep-all; // For Firefox to horizontally scroll wider tables.
+ -webkit-overflow-scrolling: touch;
+
+ th {
+ font-weight: bold;
+ }
+
+ th,
+ td {
+ padding: 0.5rem 1rem;
+ border: 1px solid $table-border-color;
+ }
+ }
+
+ dl {
+ padding: 0;
+
+ dt {
+ padding: 0;
+ margin-top: 1rem;
+ font-size: 1rem;
+ font-weight: bold;
+ }
+
+ dd {
+ padding: 0;
+ margin-bottom: 1rem;
+ }
+ }
+
+ hr {
+ height: 2px;
+ padding: 0;
+ margin: 1rem 0;
+ background-color: $hr-border-color;
+ border: 0;
+ }
+}
+
+.site-footer {
+ padding-top: 2rem;
+ margin-top: 2rem;
+ border-top: solid 1px $hr-border-color;
+
+ @include large {
+ font-size: 1rem;
+ }
+
+ @include medium {
+ font-size: 1rem;
+ }
+
+ @include small {
+ font-size: 0.9rem;
+ }
+}
+
+.site-footer {
+ text-align: center;
+}
+
+.site-footer-credits {
+ color: #ddd;
+}
+
+.site-footer-credits a {
+ color: #bbd;
+}
diff --git a/themes/cayman/layouts/404.html b/themes/cayman/layouts/404.html
new file mode 100644
index 0000000..e69de29
diff --git a/themes/cayman/layouts/_default/baseof.html b/themes/cayman/layouts/_default/baseof.html
new file mode 100644
index 0000000..0d2a659
--- /dev/null
+++ b/themes/cayman/layouts/_default/baseof.html
@@ -0,0 +1,12 @@
+
+
+{{ partial "head.html" . }}
+
+ {{ partial "header-nav.html" . }}
+
+ {{ block "main" . }}{{ end }}
+ {{ partial "footer.html" . }}
+
+ {{ partial "google-analytics-async.html" . }}
+
+
diff --git a/themes/cayman/layouts/_default/list.html b/themes/cayman/layouts/_default/list.html
new file mode 100644
index 0000000..c447b84
--- /dev/null
+++ b/themes/cayman/layouts/_default/list.html
@@ -0,0 +1,15 @@
+{{ define "main" }}
+{{ .Title }}
+
+{{ $pages := .Pages }}
+{{ range $pages.ByPublishDate.Reverse }}
+ -
+ {{ $dateFormat := $.Site.Params.dateFormat | default "Jan 2, 2006" }}
+ {{ .PublishDate.Format $dateFormat }}
+
+ {{ .Title }}
+
+
+{{ end }}
+
+{{ end }}
diff --git a/themes/cayman/layouts/_default/single.html b/themes/cayman/layouts/_default/single.html
new file mode 100644
index 0000000..b5d1799
--- /dev/null
+++ b/themes/cayman/layouts/_default/single.html
@@ -0,0 +1,4 @@
+{{ define "main" }}
+ {{ .Title }}
+ {{ .Content }}
+{{ end }}
diff --git a/themes/cayman/layouts/_default/terms.html b/themes/cayman/layouts/_default/terms.html
new file mode 100644
index 0000000..9442bcd
--- /dev/null
+++ b/themes/cayman/layouts/_default/terms.html
@@ -0,0 +1,13 @@
+{{ define "main" }}
+ {{ .Title }}
+
+ {{ range .Data.Terms.Alphabetical }}
+ -
+ {{ printf "(%d)" .Count }}
+
+ {{ .Page.Title }}
+
+
+ {{ end }}
+
+{{ end }}
diff --git a/themes/cayman/layouts/index.html b/themes/cayman/layouts/index.html
new file mode 100644
index 0000000..f7e8c65
--- /dev/null
+++ b/themes/cayman/layouts/index.html
@@ -0,0 +1,3 @@
+{{ define "main" }}
+{{ .Content }}
+{{ end }}
diff --git a/themes/cayman/layouts/partials/blog-post-list.html b/themes/cayman/layouts/partials/blog-post-list.html
new file mode 100644
index 0000000..55e69b5
--- /dev/null
+++ b/themes/cayman/layouts/partials/blog-post-list.html
@@ -0,0 +1,13 @@
+{{ .Title }}
+
+{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
+{{ range $pages.ByPublishDate.Reverse }}
+ -
+ {{ $dateFormat := $.Site.Params.dateFormat | default "Jan 2, 2006" }}
+ {{ .PublishDate.Format $dateFormat }}
+
+ {{ .Title }}
+
+
+{{ end }}
+
diff --git a/themes/cayman/layouts/partials/disqus.html b/themes/cayman/layouts/partials/disqus.html
new file mode 100644
index 0000000..e6f4d11
--- /dev/null
+++ b/themes/cayman/layouts/partials/disqus.html
@@ -0,0 +1,6 @@
+{{ $ctx := . }}
+{{ with $.Site.DisqusShortname }}
+ {{ if ne . "yourdiscussshortname" }}
+ {{ template "_internal/disqus.html" $ctx }}
+ {{ end }}
+{{ end }}
diff --git a/themes/cayman/layouts/partials/footer.html b/themes/cayman/layouts/partials/footer.html
new file mode 100644
index 0000000..7de81b7
--- /dev/null
+++ b/themes/cayman/layouts/partials/footer.html
@@ -0,0 +1,5 @@
+
diff --git a/themes/cayman/layouts/partials/google-analytics-async.html b/themes/cayman/layouts/partials/google-analytics-async.html
new file mode 100644
index 0000000..8a58c07
--- /dev/null
+++ b/themes/cayman/layouts/partials/google-analytics-async.html
@@ -0,0 +1,10 @@
+{{ if not $.Site.IsServer }}
+ {{ with $.Site.GoogleAnalytics }}
+
+
+ {{ end }}
+{{ end }}
\ No newline at end of file
diff --git a/themes/cayman/layouts/partials/head.html b/themes/cayman/layouts/partials/head.html
new file mode 100644
index 0000000..118246b
--- /dev/null
+++ b/themes/cayman/layouts/partials/head.html
@@ -0,0 +1,22 @@
+
+
+
+
+ {{ hugo.Generator }}
+ {{ $summary := trim (.Summary | plainify | htmlUnescape) "\n\r"
+ | default .Title }}
+
+
+
+ {{ $caymanScss := "scss/cayman.scss" }}
+ {{ $options := (dict "targetPath" "css/cayman.css") }}
+ {{ $caymanCss := resources.Get $caymanScss | resources.ExecuteAsTemplate $caymanScss . | toCSS $options | fingerprint }}
+
+
+
+
+
+
+ {{ partial "katex.html" . }}
+ {{ .Title }} | {{ $.Site.Title }}
+
diff --git a/themes/cayman/layouts/partials/header-nav.html b/themes/cayman/layouts/partials/header-nav.html
new file mode 100644
index 0000000..372d8ab
--- /dev/null
+++ b/themes/cayman/layouts/partials/header-nav.html
@@ -0,0 +1,18 @@
+
diff --git a/themes/cayman/layouts/partials/katex.html b/themes/cayman/layouts/partials/katex.html
new file mode 100644
index 0000000..2751fcf
--- /dev/null
+++ b/themes/cayman/layouts/partials/katex.html
@@ -0,0 +1,5 @@
+{{ if eq $.Site.Params.katex true }}
+
+
+
+{{ end }}
\ No newline at end of file
diff --git a/themes/cayman/layouts/post/single.html b/themes/cayman/layouts/post/single.html
new file mode 100644
index 0000000..be81dff
--- /dev/null
+++ b/themes/cayman/layouts/post/single.html
@@ -0,0 +1,21 @@
+{{ define "main" }}
+ {{ .Title }}
+
+ {{ $dateFormat := $.Site.Params.dateFormat | default "Jan 2, 2006" }}
+ Publish date: {{ .PublishDate.Format $dateFormat }}
+
+ {{ $tags := slice }}
+ {{ with .Params.tags }}
+
+
Tags:
+ {{ range . }}
+ {{ $href := print ("tags/" | absLangURL) (. | urlize) "/" }}
+ {{ $element := printf "
%s" $href . }}
+ {{ $tags = $tags | append $element }}
+ {{ end }}
+ {{ delimit $tags ", " }}
+
+ {{ end }}
+ {{ .Content }}
+ {{ partial "disqus.html" . }}
+{{ end }}
diff --git a/themes/cayman/layouts/shortcodes/figure.html b/themes/cayman/layouts/shortcodes/figure.html
new file mode 100644
index 0000000..b05f8d1
--- /dev/null
+++ b/themes/cayman/layouts/shortcodes/figure.html
@@ -0,0 +1,30 @@
+{{ $img := .Get "img" }}
+{{ $caption := .Get "caption" }}
+{{ $command := .Get "command" }}
+{{ $options := .Get "options" }}
+
+{{ $original := .Page.Resources.GetMatch (printf "*%s*" $img) }}
+{{ $new := "" }}
+
+{{ if eq $command "Fit" }}
+ {{ $new = $original.Fit $options }}
+{{ else if eq $command "Fill" }}
+ {{ $new = $original.Fill $options }}
+{{ else if eq $command "Resize" }}
+ {{ $new = $original.Resize $options }}
+{{ else if eq $command "Original" }}
+ {{ $new = $original }}
+{{ else }}
+ {{ errorf "Invalid image processing command: Must be one of Fit, Fill, Resize, Original." }}
+{{ end }}
+
+{{ $captionId := printf "caption-%s" ($caption | md5) }}
+
+
diff --git a/themes/cayman/static/apple-touch-icon.png b/themes/cayman/static/apple-touch-icon.png
new file mode 100644
index 0000000..ed09505
Binary files /dev/null and b/themes/cayman/static/apple-touch-icon.png differ
diff --git a/themes/cayman/static/css/normalize.css b/themes/cayman/static/css/normalize.css
new file mode 100644
index 0000000..30366a6
--- /dev/null
+++ b/themes/cayman/static/css/normalize.css
@@ -0,0 +1,424 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */ /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
diff --git a/themes/cayman/static/favicon-16x16.png b/themes/cayman/static/favicon-16x16.png
new file mode 100644
index 0000000..cb27de2
Binary files /dev/null and b/themes/cayman/static/favicon-16x16.png differ
diff --git a/themes/cayman/static/favicon-32x32.png b/themes/cayman/static/favicon-32x32.png
new file mode 100644
index 0000000..4a4cb06
Binary files /dev/null and b/themes/cayman/static/favicon-32x32.png differ
diff --git a/themes/cayman/static/favicon.ico b/themes/cayman/static/favicon.ico
new file mode 100644
index 0000000..7a25b69
Binary files /dev/null and b/themes/cayman/static/favicon.ico differ
diff --git a/themes/cayman/task_serve.sh b/themes/cayman/task_serve.sh
new file mode 100644
index 0000000..80281fd
--- /dev/null
+++ b/themes/cayman/task_serve.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+cd exampleSite
+hugo serve --themesDir ../..
+cd ..
diff --git a/themes/cayman/theme.toml b/themes/cayman/theme.toml
new file mode 100644
index 0000000..b8abab4
--- /dev/null
+++ b/themes/cayman/theme.toml
@@ -0,0 +1,17 @@
+name = "Cayman"
+license = "CC BY 4.0"
+licenselink = "https://creativecommons.org/licenses/by/4.0/"
+description = "Cayman is a clean, responsive theme for Hugo, ported from the original Jekyll Cayman Theme."
+homepage = "https://github.com/zwbetz-gh/cayman-hugo-theme"
+tags = ["blog", "clean", "color configuration"]
+features = ["blog", "clean", "color configuration"]
+min_version = "0.81.0"
+
+[author]
+ name = "Zachary Betz"
+ homepage = "https://zwbetz.com/"
+
+[original]
+ name = "Cayman"
+ homepage = "https://github.com/jasonlong/cayman-theme"
+ repo = "https://github.com/jasonlong/cayman-theme"