Essay.dev is a blogging service by OneGraph that lets you publish your own blog by creating an issue on GitHub.
Create an issue on OneGraph/essay.dev and it will become a blog post at your-github-username.essay.dev.
It's the easiest way to start a developer-focused blog. You don't have to sign up for anything or even log in. Just create an issue and that's your first post.
Since it's backed by GitHub issues, anybody with a GitHub account can add a comment or reaction to your post and you'll get a notification through the GitHub notification system that you're already familiar with.
Unlike other platforms (looking at you Medium), if you ever want to move your content to a different platform, you can export all of your data in full fidelity as markdown or HTML.
If you'd prefer to host your content yourself or on your own domain, there's a Vercel button for that.
Issues are fetched from GitHub using OneGraph's persisted GraphQL queries. Persisted queries are an underutilized GraphQL feature with many benefits over plain queries. The benefit that makes them well-suited for our use-case is that we can attach metadata to the query.
GitHub doesn't allow unauthenticated queries, so we attach a default auth to the query when we persist it. We also tell OneGraph to only allow requests for issues from the essay.dev repo and to cache the results of the query for 5 minutes so that we don't blow through our rate limit. You can read more about persisted queries in the OneGraph docs.
We use the wildcard domains support from Vercel and next.js to determine the author from the subdomain. The first part of the subdomain tells us which GitHub user's issues to fetch.
All of the code is published on GitHub. Essay.dev uses the essay.dev branch of the OneBlog repo with a few changes required to support multiple users on the same domain.
Comments and reactions backed by GitHub.
Full markdown support.
Beautiful code highlighting with support for 90 languages and 20 themes.
import React from 'react';
import ReactDOM from "react-dom";
function Message() {
return (
<div className="hello" onClick={someFunc}>
<span>Hello World</span>
</div>
);
}
ReactDOM.render(<Message />, document.body);
Fully-featured RSS feed, with the proper meta tags for auto-discovery.
Open Graph tags so that your posts look great when you share them on social media.
SEO friendly, with a sitemap properly linked from the robots.txt so that searh engines will find you.
Questions? Create an issue on the OneBlog repo or hop into our Spectrum.