# Shinmun **Repository Path**: mirrors/Shinmun ## Basic Information - **Project Name**: Shinmun - **Description**: Shinmun是基于文件的小而美博客引擎,在喜欢的编辑器中编写帖子,使用 git 跟踪它们并部署到 Heroku - **Primary Language**: Ruby - **License**: MIT - **Default Branch**: master - **Homepage**: https://www.oschina.net/p/shinmun - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 0 - **Created**: 2021-05-17 - **Last Updated**: 2026-02-21 ## Categories & Tags **Categories**: blog **Tags**: None ## README Shinmun - a file based blog engine ================================= Shinmun is a small file based blog engine. Write posts in your favorite editor, track them with git and deploy to Heroku. Small, fast and simple. ### Features * Posts are text files formatted with [Markdown][8], [Textile][9] or [HTML][10] * Deploy via Github Pages * Index, category and archive listings * RSS feeds * Syntax highlighting provided by [Rouge][4] * **TypeScript mini apps** - embed interactive TypeScript code in your pages * **AI-powered CLI** - generate drafts, auto-tag posts, and create SEO descriptions * **Reading time** - automatic reading time estimates for posts * **Related posts** - find similar posts by tags and categories * **Table of contents** - auto-generated TOC from headings * **SEO meta tags** - Open Graph and Twitter Cards support * **Sitemap** - automatic sitemap.xml generation * **Search** - JSON search index for client-side search * **Draft posts** - keep drafts unpublished until ready * **Pagination** - helpers for paginating post listings ### Quickstart Install the gems: $ gem install shinmun Create a sample blog: $ shinmun init myblog This will create a directory with all necessary files. Now start the web server: $ cd myblog $ rackup Browse to the following url: http://localhost:9292 Voilà, your first blog is up and running! ### Writing Posts Posts can be created by using the `shinmun` command inside your blog folder: shinmun post 'The title of the post' Shinmun will then create a post file in the right place, for example in `posts/2008/9/the-title-of-the-post.md`. #### AI-Generated Drafts Add the `--ai` flag to generate a complete draft with content, tags, and metadata: shinmun post 'The future of Ruby' --ai This requires an API key from Anthropic or OpenAI: export ANTHROPIC_API_KEY="your-key" # or OPENAI_API_KEY The AI assistant will: - Write 3-4 structured paragraphs based on your title - Select a category from your `config.yml` - Suggest relevant tags - Generate an SEO description See the [AI Assistant Guide](pages/ai-assistant-guide.md) for details. ### Post Format Each blog post is just a text file with a YAML header and a body. The YAML header is surrounded with 2 lines of 3 dashes. The YAML header has following attributes: * `title`: mandatory * `date`: posts need one, pages not * `category`: a post belongs to one category * `tags`: a comma separated list of tags * `description`: SEO meta description (optional, can be AI-generated) * `draft`: set to `true` to keep the post unpublished Example post: --- date: 2008-09-05 category: Ruby tags: kramdown, markdown title: Kramdown, a Markdown library description: A practical guide to using Kramdown for Markdown processing in Ruby applications. draft: false --- This is the summary, which is by definition the first paragraph of the article. The summary shows up in category listings or the index listing. #### Enhancing Existing Posts Use `ai-enhance` to add metadata to posts you've already written: shinmun ai-enhance posts/2024/12/my-post.md This analyzes your content and fills in empty category, tags, and description fields. ### Syntax highlighting Thanks to the fantastic highlighting library [Rouge][4], highlighted code blocks can be embedded easily in Markdown. Rouge supports a wide variety of languages including Ruby, Python, JavaScript, C, Java, HTML, CSS, JSON, YAML, and many more. To activate Rouge for a code block, you have to declare the language in lower case: @@ruby def method_missing(id, *args, &block) puts "#{id} was called with #{args.inspect}" end **Note that the declaration MUST be followed by a blank line!** ### TypeScript Mini Apps Shinmun supports embedding TypeScript mini apps directly in your pages. TypeScript code is compiled to JavaScript using [esbuild][12] and embedded as a `