😋 Make your own blog!

Overview

Leven

Cargo Travis Appveyor

Leven is a lightweight Markdown-based static site generator for blogs. It's a lot like Jekyll or Hugo, but it's much simpler, much faster, and made specifically for blogs.

static site generator

/ˈstatɪk sʌɪt ˈdʒɛnəreɪtə/

takes in your blog posts and converts them into a standalone HTML website that you can upload to GitHub Pages or Netlify or Neocities or just about anywhere else.

Getting Started

See the wiki page to get started in just a few minutes.

Feature Requests / Bug Reports

Even if you're uncertain, opening an issue would really help us make this project better!

Comments
  • Option to generate relative URLs?

    Option to generate relative URLs?

    It would be nice to be able to publish a Leven blog as a sub-page on a website - so that using Leven wouldn't require a dedicated domain only for the blog.

    I'm guessing this could be done either with a configuration option for Leven's "root path", or an option to never have absolute URLs?

    My main reason for wanting this is to experiment with publishing Leven without having to redo existing pages or change top-level configuration. This would also be useful for demonstrating multiple configurations of a theme, or other demonstrations where having a domain-per-instance is not practical.

    If this is already an option, could it be added to the documentation?

    opened by daboross 2
  • A theming solution.

    A theming solution.

    Maybe add a subcommand that git clones template directories for you, and assumes that all relative paths are actually referring to GitHub because that's the only thing about NPM that I like?

    feature hard 
    opened by quadrupleslap 2
  • Make init easier.

    Make init easier.

    Why can't I just do leven new folder-name instead of mkdir folder-name; cd folder-name; leven init?

    Also, it's kind of annoying to run the server using Python's http.server because you have to change directories, got any good workarounds?

    feature easy 
    opened by sidney-pham 1
  • Use configuration file.

    Use configuration file.

    This would be really good for:

    • Choosing the number of posts on the index page.
    • Finding the root of the blog instead of making the terrible assumption that it's the current directory.
    bug easy 
    opened by quadrupleslap 1
  • Atom syndication

    Atom syndication

    Implementation for #25 . Allows to generate an atom feed for the blog. Validated with w3c and tested with feedly and found to work fine. Following fields are required for it in Leven.toml:

    • uuid (a uuid, used to identify the feed)
    • home_url (the homepage of the feed website)
    • base_url (the base url of the blog, could be same as home_url but doesn't have to)
    • feed_url (the url of the feed.xml, could perhaps be derived from base_url)
    • author (the author of the blog)
    • email (the email of the author)

    Optionally a date can also be specified to be used for the generated feed xml, if not specified, now is used.

    opened by andete 3
  • support for optional hugo-style metadata block

    support for optional hugo-style metadata block

    E.g.:

    +++ date = "2016-12-09T00:00:00+02:00" +++

    Currently supports a date and a title field. If they are present they override the built-in approach of leven.

    opened by andete 2
  • Add SEO Metadata.

    Add SEO Metadata.

    Ghost does it by letting users set 'Meta Title' and 'Meta Description'. This is what the <head> of a blog post looks like for reference, with Meta Title = 'A Cow - Sidney Pham' and Meta Description = 'Cows':

    <head>
        <meta http-equiv="Content-Type" content="text/html" charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    
        <title>A Cow - Sidney Pham</title>
    
        <meta name="HandheldFriendly" content="True" />
        <meta name="MobileOptimized" content="320" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    
        <link rel="stylesheet" type="text/css" href="/assets/css/normalize.css?v=467ef9cd4a" />
        <link rel="stylesheet" type="text/css" href="/assets/css/nprogress.css?v=467ef9cd4a" />
        <link rel="stylesheet" type="text/css" href="/assets/css/style.css?v=467ef9cd4a" />
        <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&subset=latin,cyrillic-ext,latin-ext,cyrillic" />
        <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" />
        <!-- <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet"> -->
    
        <meta name="description" content="Cows" />
        <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
        <link rel="canonical" href="http://sidneypham.me/an-xor-trick/" />
        <meta name="referrer" content="no-referrer-when-downgrade" />
        <link rel="amphtml" href="http://sidneypham.me/an-xor-trick/amp/" />
        
        <meta property="og:site_name" content="Sidney Pham - Blog" />
        <meta property="og:type" content="article" />
        <meta property="og:title" content="A Cow - Sidney Pham" />
        <meta property="og:description" content="Cows" />
        <meta property="og:url" content="http://sidneypham.me/an-xor-trick/" />
        <meta property="article:published_time" content="2017-10-13T07:16:31.000Z" />
        <meta property="article:modified_time" content="2017-10-26T02:50:36.000Z" />
        <meta property="article:tag" content="coding" />
        <meta property="article:tag" content="algorithms" />
        
        <meta name="twitter:card" content="summary" />
        <meta name="twitter:title" content="A Cow - Sidney Pham" />
        <meta name="twitter:description" content="Cows" />
        <meta name="twitter:url" content="http://sidneypham.me/an-xor-trick/" />
        <meta name="twitter:label1" content="Written by" />
        <meta name="twitter:data1" content="Sidney Pham" />
        <meta name="twitter:label2" content="Filed under" />
        <meta name="twitter:data2" content="coding, algorithms" />
        
        <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "Article",
        "publisher": {
            "@type": "Organization",
            "name": "Sidney Pham - Blog",
            "logo": {
                "@type": "ImageObject",
                "url": "http://sidneypham.me/favicon.ico",
                "width": 60,
                "height": 60
            }
        },
        "author": {
            "@type": "Person",
            "name": "Sidney Pham",
            "url": "http://sidneypham.me/author/sidney/",
            "sameAs": []
        },
        "headline": "A Cow - Sidney Pham",
        "url": "https://sidneypham.me/an-xor-trick/",
        "datePublished": "2017-10-13T07:16:31.000Z",
        "dateModified": "2017-10-26T02:50:36.000Z",
        "keywords": "coding, algorithms",
        "description": "Cows",
        "mainEntityOfPage": {
            "@type": "WebPage",
            "@id": "http://sidneypham.me/"
        }
    }
        </script>
    
        <meta name="generator" content="Ghost 1.7" />
        <link rel="alternate" type="application/rss+xml" title="Sidney Pham - Blog" href="https://sidneypham.me/rss/" />
    </head>
    
    feature easy 
    opened by sidney-pham 1
  • Allow static pages.

    Allow static pages.

    I want my own About static page that isn't listed in the Archive!

    Add a leven static-post <Title> command which outputs a file to /static-posts that doesn't have a date.

    feature medium high-priority 
    opened by sidney-pham 0
Releases(v0.6.0)
Owner
A mostly inactive static blog generator. :(
null
Sūshì is a simple but customizable static site generator / blog generator written in Rust

sūshì Sūshì is a simple but customizable static site generator / blog generator written in Rust. Installation Install with Cargo (Recommended) cargo i

MrNothing233 2 Mar 20, 2022
rublog /rʌblɑg/ is a static blog generator written in Rust

README README About rublog demo DEMO Install use Initialize from rublog-template rublog command Publishing the web page Development Plan TOML Front Ma

null 10 Jul 24, 2023
My own image file format created for fun! Install the "hif_opener.exe" to open hif files. clone the repo and compile to make your own hif file

Why am i creating this? I wanted to create my own image format since I was 12 years old using Windows 7, tryna modify GTA San Andreas. That day, when

hiftie 3 Dec 17, 2023
Rust-blog - Educational blog posts for Rust beginners

pretzelhammer's Rust blog ?? I write educational content for Rust beginners and Rust advanced beginners. My posts are listed below in reverse chronolo

kirill 5.2k Jan 1, 2023
Bring your blog to Fediverse. [WIP]

Hatsu Bring your blog to Fediverse. [WIP] Development Hatsu is in the early stages of development, PR welcome. Setup # clone project git clone http

!mportantImport 4 Jul 24, 2023
A library that makes it VERY easy to run Holochain as a library, from your own binary, with great defaults

embedded-holochain-runner A library that makes it VERY easy to run Holochain as a library, from your own binary, with great defaults How it will work

Sprillow 14 Jul 23, 2022
A puzzle game where you eat your own tail to win!

taileater taileater is a puzzle game available for free here: https://szunami.itch.io/taileater This project is built using Rust and Bevy. Assets were

null 25 Dec 20, 2022
miette is a diagnostic library for Rust. It includes a series of traits/protocols that allow you to hook into its error reporting facilities, and even write your own error reports!

miette is a diagnostic library for Rust. It includes a series of traits/protocols that allow you to hook into its error reporting facilities, and even write your own error reports!

Kat Marchán 1.2k Jan 1, 2023
The lightest distributed consensus library. Run your own replicated state machine! ❤️

Little Raft The lightest distributed consensus library. Run your own replicated state machine! ❤️ Installing Simply import the crate. In your Cargo.to

Ilya Andreev 359 Dec 26, 2022
A LED Christmas Tree controlled by Rust. Contribute your own renderers!

Rusty Christmas Tree This is code that draws on the LED Christmas Tree made by @aidancrowther. You can see his 3D design files and Pi Pico setup code

Forest Anderson 43 May 15, 2022
Server with Rust, Rocket, Diesel, Docker to create your own to-do-list

Installation Install Docker & Docker-Compose Then download the repository go to the root where the Dockerfile is and do: sudo docker-compose up sudo i

Lucas Aries 3 Aug 19, 2022
State of the art "build your own engine" kit powered by gfx-hal

A rendering engine based on gfx-hal, which mimics the Vulkan API. Building This library requires standard build tools for the target platforms, except

Amethyst Foundation 801 Dec 28, 2022
This is starter for your own game-specific tools

Bevy Toolbar Usage: This is starter for your own game-specific tools, clone source and manually add it to [workspace] section in Cargo.toml. Now add i

null 15 Sep 11, 2022
Notifiy when one of Elon Musk's jets flyover your own ADS-B receiver

With inpsiration from twitter/@ElonJet, this app will print notifications when one of Elon Musk's jets fly over your own ADS-B receiver ground station.

Rust ADS-B 6 Dec 19, 2022
Zine - a simple and opinionated tool to build your own magazine.

zine Zine - a simple and opinionated tool to build your own magazine. Mobile-first. Intuitive and elegant magazine design. Best reading experiences. T

null 765 Jan 2, 2023
A toolkit for building your own interactive command-line tools in Rust

promkit A toolkit for building your own interactive command-line tools in Rust, utilizing crossterm. Getting Started Put the package in your Cargo.tom

null 70 Dec 18, 2022
A bring-your-own-mutex version of once_cell.

generic_once_cell generic_once_cell is a generic no_std version of once_cell. Internal synchronization for initialization is provided as type paramete

Martin Kröning 3 Nov 28, 2022
Write your own exploit for $CASH

Cashio Exploit Workshop The Cashio hack was one of the biggest hacks occurred in Solana ecosystem which allowed the attacker to print infinite amount

Narya.ai 21 Mar 22, 2023
Build your own Riscv Emulator in Rust.

Rare: Rust A Riscv Emulator RISC-V 模拟器教程 This tutorial is based on Asami's excellent tutorial. Although the author haven't finished it, she have alrea

Sakya Demon 74 Jul 9, 2023
Create `.gitignore` files using one or more templates from TopTal, GitHub or your own collection

gitnr A cross-platform CLI utility to create .gitignore files using templates. Use templates from the GitHub & TopTal collections Use local files and

reemus.dev 25 Sep 2, 2023