{"id":13771728,"url":"https://github.com/justlark/gempost","last_synced_at":"2025-04-25T09:31:53.924Z","repository":{"id":219104154,"uuid":"740221157","full_name":"justlark/gempost","owner":"justlark","description":"A simple static site generator for creating a blog on the Gemini protocol","archived":false,"fork":false,"pushed_at":"2024-05-04T21:05:15.000Z","size":221,"stargazers_count":10,"open_issues_count":3,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-03T19:40:16.568Z","etag":null,"topics":["atom-feed","blogging","gemini-protocol","static-site-generator"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/justlark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-07T21:35:19.000Z","updated_at":"2025-03-11T22:58:31.000Z","dependencies_parsed_at":"2024-05-04T22:20:58.990Z","dependency_job_id":"8abc8b53-0e2e-4c79-9b90-2db6b9c7c19d","html_url":"https://github.com/justlark/gempost","commit_stats":null,"previous_names":["justlark/gempost"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlark%2Fgempost","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlark%2Fgempost/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlark%2Fgempost/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlark%2Fgempost/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/justlark","download_url":"https://codeload.github.com/justlark/gempost/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250790139,"owners_count":21487756,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atom-feed","blogging","gemini-protocol","static-site-generator"],"created_at":"2024-08-03T17:00:54.817Z","updated_at":"2025-04-25T09:31:53.643Z","avatar_url":"https://github.com/justlark.png","language":"Rust","funding_links":[],"categories":["Tools"],"sub_categories":["Graphical"],"readme":"# gempost\n\ngempost is a minimal static site generator for publishing a blog (gemlog) on\nthe [Gemini protocol](https://geminiprotocol.net/).\n\nYou store metadata about each gemlog post in a sidecar YAML file, and gempost\ngenerates a gemtext index page and an Atom feed.\n\nYou can use a [Tera](https://keats.github.io/tera/) template to customize the\nformat of the index page. You can also use a template to customize the format\nof the gemlog posts themselves, such as to add a copyright footer or a\nnavigation header to each post. See [Examples](#Examples) for examples of both.\n\nThe metadata in the sidecar YAML file allows you to generate an Atom feed with\nrich metadata, but most of this metadata is optional and not necessary to\ngenerate a working feed.\n\n## Getting started\n\n### Installing gempost\n\nTo install gempost, you must first [install\nRust](https://www.rust-lang.org/tools/install). Then, you can install gempost\nwith Cargo.\n\n```shell\ncargo install gempost\n```\n\n### Creating a new gempost project\n\nYou can initialize a new gempost project like this:\n\n```shell\ngempost init ./capsule\n```\n\nThis will create a directory `./capsule/` that looks like this:\n\n```\ncapsule/\n├── gempost.yaml\n├── posts/\n│   ├── hello-world.gmi\n│   └── hello-world.yaml\n├── static/\n│   └── index.gmi\n└── templates/\n    ├── index.tera\n    └── post.tera\n```\n\nThis includes:\n\n- An example `gempost.yaml` config file to get you started. You'll need to edit\n  this to set your capsule's title and URL.\n- Some basic templates you can use as-is or customize.\n- A \"hello world\" example post for your gemlog, with its accompanying sidecar\n  metadata file.\n- A static `index.gmi` for your capsule root.\n\nEdit the `gempost.yaml` and you're ready to build your capsule!\n\n### Building your capsule\n\n```shell\ncd ./capsule\ngempost build\n```\n\nYour capsule will be generated in the `./public/` directory. You'll need a\nGemini server like [Agate](https://github.com/mbrubeck/agate) to actually serve\nyour capsule over the Gemini protocol. Check out [Awesome\nGemini](https://github.com/kr1sp1n/awesome-gemini#servers) for a more complete\nlist of Gemini servers.\n\n### Creating a new post\n\nYou can add a new post to your gemlog with `gempost new \u003cslug\u003e`. This creates a\n`.gmi` file in the `./posts/` directory with an accompanying `.yaml` metadata\nfile. See [examples/metadata.yaml](./examples/metadata.yaml) for an example of\nall the different values you can set in the YAML metadata file. Only some are\nrequired.\n\n### Adding static content\n\nYou can add new static content to your capsule (anything that's not your\ngemlog) by putting it in the `./static/` directory. If a file in the static\ndirectory conflicts with one generated by gempost, the one if the static\ndirectory will win.\n\n### Customizing templates\n\nYou can customize the index page and post page templates in the `./templates/`\ndirectory from their defaults. They use the\n[Tera](https://keats.github.io/tera/) text templating language, which is\nsimilar to the popular Jinja templating language. See the\n[Templates](#templates) section below for a list of all the variables that are\navailable inside these template.\n\n## Examples\n\nRunning `gempost init` will generate minimal index page and post page templates\nyou can use to get started. These will probably be fine for most users.\n\nHowever, if you want to see more complex examples of what you can do with\ntemplates, the examples below make use of more of the post metadata to provide\nmore rich output. You can use these templates as-is, or as a guide to write\nyour own.\n\n- See [examples/index.tera](./examples/index.tera) for an example of an index\n  page template.\n- See [examples/post.tera](./examples/post.tera) for an example of a post page\n  template.\n\nAdditionally, see [examples/metadata.yaml](./examples/metadata.yaml) for an\nexample of a sidecar gemlog post metadata file showing all the possible fields.\n\n## Templates\n\nThe index page template has access to:\n- A `feed` variable which is a Feed object.\n\nThe post page template has access to:\n- A `feed` variable which is a Feed object.\n- An `entry` variable which is an Entry object for the current post.\n\nAll dates are in RFC 3339 format, which looks like this:\n\n```\n2006-01-02T15:04:05Z07:00\n```\n\n### Author object\n\n- `name` *(string)* The name of the author\n- `email` *(string, optional)* The author's email address\n- `uri` *(string, optional)* A URI describing the author\n\n### Entry object\n\n- `url` *(string)* The URL of the post\n- `title` *(string)* The title of the post\n- `body` *(string)* The gemtext body of the post\n- `updated` *(string)* When the post was last updated\n- `summary` *(string, optional)* The summary of the post\n- `published` *(string, optional)* When the post was originally published\n- `author` *(Author object, optional)* The author of the post\n- `rights` *(string, optional)* The copyright and license information for the post\n- `lang` *(string, optional)* The RFC 5646 language code for the language the\n  post is written in (e.g. `en`, `de`)\n- `categories` *(array of strings)* The list of categories the post belongs to\n\n### Feed object\n\n- `capsule_url` *(string)* The URL of your capsule's homepage\n- `feed_url` *(string)* The URL of the Atom feed\n- `index_url` *(string)* The URL of the gemlog index page\n- `title` *(string)* The title of the feed\n- `updated` *(string)* When any post in the feed was last updated\n- `subtitle` *(string, optional)* The subtitle of the feed\n- `rights` *(string, optional)* The copyright and license information for the feed\n- `author` *(Author object, optional)* The primary author of the feed\n- `entries` *(array of Entry objects)* The list of posts in the feed, sorted\n  reverse-chronologically by publish date or, if no publish date, last updated\n  date\n\n## Suggestions\n\nHere are some miscellaneous suggestions for working with gempost.\n\nYou can check your gempost project directory into a VCS of your choice if you\nlike; just make sure you configure it to ignore the `./public/` directory!\n\nIf your Gemini server expects to find your capsule in a particular directory,\nyou can change the location of the `./public/` directory from its default in\nthe `gempost.yaml`. Note that file paths in the `gempost.yaml` do not support\ntilde expansion.\n\nEvery post must have a unique ID to generate the Atom feed. Atom require that\nthis be a globally unique URI that never ever changes. So, as an alternative to\nusing your post URL, which might change, you can use a UUID URN:\n\n```\nurn:uuid:165b10e8-78c9-45ba-83ef-2f7bd5d89725\n```\n\nRunning `gempost new` will automatically assign a UUID post ID.\n\nEach post must have a time last updated and, optionally, time originally\npublished. To get the current time in RFC 3339 format—the format gempost\nexpects—you can use this command on \\*nix platforms:\n\n```shell\ndate --rfc-3339 seconds\n```\n\n## Similar tools\n\nCheck out these other awesome static site generators for gemlogs:\n\n- [gloggery](https://github.com/kconner/gloggery)\n- [gssg](https://git.sr.ht/~gsthnz/gssg)\n- [kiln](https://git.sr.ht/~adnano/kiln)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustlark%2Fgempost","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjustlark%2Fgempost","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustlark%2Fgempost/lists"}