Need help?

Here are some common questions on using this platform that we would like to answer.

# I get a permission denied when trying to SSH

Unfortunately SHA-2 RSA keys are not currently supported.

Unfortunately, due to a shortcoming in Go’s x/crypto/ssh package, we not currently support access via new SSH RSA keys: only the old SHA-1 ones will work. Until we sort this out you’ll either need an SHA-1 RSA key or a key with another algorithm, e.g. Ed25519. Not sure what type of keys you have? You can check with the following:

$ find ~/.ssh/id_*.pub -exec ssh-keygen -l -f {} \;

If you’re curious about the inner workings of this problem have a look at:

# Generating a new SSH key

Github reference

ssh-keygen -t ed25519 -C "your_email@example.com"
  1. When you're prompted to "Enter a file in which to save the key," press Enter. This accepts the default file location.
  2. At the prompt, type a secure passphrase.

# What should my blog folder look like?

Currently prose.sh only supports a flat folder structure. Therefore, scp -r is not permitted. We also only allow .md files to be uploaded.

Here is the source to my blog on this platform

Below is an example of what your blog folder should look like:

blog/
first-post.md
second-post.md
third-post.md

Underscores and hyphens are permitted and will be automatically removed from the title of the post.

# How do I update metadata like publish date and title?

We support adding frontmatter to the top of your markdown posts. A frontmatter looks like the following:

---
title: some title!
description: this is a great description
date: 2022-06-28
---

List of available variables can be found here.

Common variables:

# How can I add a footer to all of my posts?

We have a special file _footer.md that will be appended to every single blog post.

There is nothing that differentiates itself from the rest of the post so it's up to you to style it. For convenience we added an id to the containing element post-footer.

# How do I update a post?

Updating a post requires that you update the source document and then run the scp command again. If the filename remains the same, then the post will be updated.

# How do I delete a post?

Because scp does not natively support deleting files, I didn't want to bake that behavior into my ssh server.

However, if a user wants to delete a post they can delete the contents of the file and then upload it to our server. If the file contains 0 bytes, we will remove the post. For example, if you want to delete delete.md you could:

cp /dev/null delete.md
scp ./delete.md prose.sh:/

Alternatively, you can go to ssh prose.sh and select "Manage posts." Then you can highlight the post you want to delete and then press "X." It will ask for confirmation before actually removing the post.

# When I want to publish a new post, do I have to upload all posts everytime?

Nope! Just scp the file you want to publish. For example, if you created a new post called taco-tuesday.md then you would publish it like this:

scp ./taco-tuesday.md prose.sh:

# How can I customize my blog page?

There's a special file you can upload `_readme.md` which will allow users to add a bio and links to their blog landing page.

---
title: some title!
description: this is a great description
nav:
    - google: https://google.com
    - site: https://some.site
---

Here is a quick intro to my personal blog!
This will show up on the blog landing page.

List of available variables:

# How can I change the theme of my blog?

There's a special file you can upload `_styles.css` which will allow users to add a CSS file to their page. It will be the final CSS file loaded on the page so it will overwrite whatever styles have previously been added. We've also added a couple of convenience id's attached to the body element for the blog and post pages.

/* _styles.css */
#post {
    color: green;
}

#blog {
    color: tomato;
}

Then just upload the file:

scp _styles.css @prose.sh:/

# How can I change the layout of my blog?

Inside the _header.txt metadata file, there's a variable layout option that will change the layout of your blog index page.

Currently supported options

# How can I upload images?

We allow prose to upload images to imgs. For example, if you want to upload images for prose.sh all you have to do is include your images in the rsync or scp command.

scp profile.jpg user@prose.sh:/

Then when you want to reference the file, you can reference it like so:

![profile pic](/profile.jpg)

# What file types are supported?

see imgs help page

# What is my blog URL?

https://{username}.prose.sh

# How can I automatically publish my post?

There is a github action that we built to make it easy to publish your blog automatically.

A user also created a systemd task to automatically publish new posts. Check out this github discussion for more details.

# Can I create multiple accounts?

Yes! You can either a) create a new keypair and use that for authentication or b) use the same keypair and ssh into our CMS using our special username ssh new@prose.sh.

Please note that if you use the same keypair for multiple accounts, you will need to always specify the user when logging into our CMS.

# Setup a custom domain

A blog can be accessed from a custom domain. HTTPS will be automatically enabled and a certificate will be retrieved from Let's Encrypt. In order for this to work, 2 DNS records need to be created:

CNAME for the domain to prose (subdomains or DNS hosting with CNAME flattening) or A record

CNAME subdomain.yourcustomdomain.com -> prose.sh

Resulting in:

subdomain.yourcustomdomain.com.         300     IN      CNAME   prose.sh.

And a TXT record to tell Prose what blog is hosted on that domain at the subdomain entry _prose

TXT _prose.subdomain.yourcustomdomain.com -> yourproseusername

Resulting in:

_prose.subdomain.yourcustomdomain.com.         300     IN      TXT     "hey"

Depending on your DNS, this could take some time to fully switch over. We have an endpoint to check whether or not custom domains are setup:

curl -vvvv https://prose.sh/check?domain=

# Hugo support

We support a subset of pre-defined hugo variables in our frontmatter. Complete list at Hugo

Variable Supported Planned
aliases yes -
audio no no
cascade no no
date yes -
description yes -
draft yes -
expiryDate no no
headless no no
images no no
isCJKLanguage no no
keywords no yes
layout no maybe
lastmod no maybe
linkTitle no no
markup no no
outputs no no
publishDate no no
resources no no
series no no
slug no no
summary no no
tags yes -
title yes -
type no no
url no no
videos no no
weight no no
taxonomies no no