Simple, clean, and fast one-page Hugo portfolio theme accompanied by a blog
Clone or download
Latest commit 8212ba4 Jun 29, 2018



Osprey is a simple, clean, and fast one-page Hugo portfolio accompanied by a blog.





Option 1: Clone Repository

In the root of your Hugo site directory run:

$ cd themes
$ git clone

Option 2: Create Submodule

Create a submodule linked directly to the theme's GitHub repository in order to receive updates:

$ git submodule add themes/osprey

Then run:

$ git submodule update --init --recursive --remote


Osprey comes with several configuration options to aid in site customization. This is an example config.toml file:

title = "Osprey Example Site"
baseURL = ""
tags = ["portfolio", "web design", "blog"]
languageCode = "en-US"
config = "config.toml"
theme = "osprey"
canonifyURLS = true
googleAnalytics = ""
disqusShortname = "tomanistor"
disableKinds = ["taxonomy", "taxonomyTerm"] # This theme does not currently use "tag" and "category" taxonomies

    tagline = "Osprey Example Site"
    author = "Toma Nistor"
    description = "Full-stack web developer and UI/UX enthusiast based in San Diego, CA."
    logoBig = "/images/osprey-logo.png"
    logoSmall = "/images/osprey-logo.png"
    favicon = "favicon.ico"
    opengraphImage = "/images/osprey.png"
    twitter = "TomaNistor"
    linkedin = "tomanistor"
    github = "tomanistor"
    facebook = ""
    email = ""
    googleTagManager = ""
    highlightJS = true
    copyright = true
    credit = true
    customCSS = false
    cacheBustCSS = false
    cacheBustJS = false
    ajaxFormspree = true

    name = "About"
    url  = "/#about"
    weight = 1
    name = "Work"
    url  = "/#work"
    weight = 2
    name = "Blog"
    url  = "/#blog"
    weight = 3
    name = "Contact"
    url  = "/#contact"
    weight = 4

Using Osprey

The two main content types are blog posts and gallery images.

About Section

To create an about section that renders on the home page, run:

$ hugo new

Blog Posts

To create a new blog post, run:

$ hugo new blog/

Gallery Images

To add a new image to your portfolio, run:

$ hugo new gallery/

The gallery archetype comes with its own configuration. Here is an example:

date = "2017-05-10T21:35:17-07:00"
title = "Image Title"
image = "image-file.png"
alt = "This is a description of the image"
color = "#7ac143"
link1 = ""
link2 = ""

Contact Form

The email address specified in the config.toml file will be one receiving messages sent through the contact form. The contact form is operated by Formspree and requires that the form must be submitted once initially to confirm the email address being used. See instruction here.

Contact Form Troubleshooting

If you have problems with the contact form (doing nothing on submit, seems Formspree ajax implementation works only for paid users), just create a copy of osprey/layouts/partials/body-bottom.html file inside your-site/layouts/partials and remove or comment lines 4 to 8.

Should look like this.

<script src=""></script>
{{ if .IsHome }}
  <script src="/scripts/{{ if .Site.Params.cacheBustJS }}{{ index .Site.Data.cachedAssets "index.js" }}{{ else }}index.min.js{{ end }}" type="text/javascript"></script>
{{ else }}
  <script src="/scripts/{{ if .Site.Params.cacheBustJS }}{{ index .Site.Data.cachedAssets "main.js" }}{{ else }}main.min.js{{ end }}" type="text/javascript"></script>
{{ end }}

That will override the original osprey body-bottom.html and remove the ajax script. Now you can receive messages through your contact form without any problem.

PD: This will add an extra step to the contact form, on submitting the user need to fill a captcha before sending the message.

Custom CSS

To implement custom CSS sitewide, change the config.toml parameter customCSS from false to true and then create a css.html file in your layouts/partials/ folder like the example below:

  <!-- This will remove the shadow on the navbar -->
  nav {
    box-shadow: none;

This will render inline CSS in the head of your site and without adding an extra HTTP request.

Cache Busting

To implement cache busting of CSS and JS static assets with something like Gulp.js and gulp-hash, change the config.toml parameters cacheBustCSS and cacheBustJS from false to true and follow this setup guide.


If you'd like to help with the development of this theme, I encourage you to submit a pull request or create an issue if you find a bug. All help is appreciated.


This theme is released under the Apache 2.0 license. For more information read the license.