# 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
ssh-keygen -t ed25519 -C "your_email@example.com"
- When you're prompted to "Enter a file in which to save the key," press Enter. This accepts the default file location.
- 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:
- title (custom title not dependent on filename)
- description (what is the purpose of this post? It's also added to meta tag)
- date (suggested format YYYY-MM-DD, if set in future post wil be unlisted)
- tags (
[feature, announcement]
) - image (og image)
- card (og image twitter card: summary, summary_large_image, etc.)
# 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:
- title (name of the blog, default: "X's blog")
- description (description of blog)
- nav (key=value pair that corresponds to text=href in html)
- image (og image)
- card (og image twitter card: summary, summary_large_image, etc.)
- favicon
- aliases (list of alternate routes e.g.
2023/03/10/my-post
)
# 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
- default
- aside
# 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:

# What file types are supported?
# 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 |