{"id":28630944,"url":"https://github.com/piotrmurach/slideck","last_synced_at":"2025-10-24T08:20:30.118Z","repository":{"id":41806718,"uuid":"510375489","full_name":"piotrmurach/slideck","owner":"piotrmurach","description":"Present Markdown-powered slide decks in the terminal.","archived":false,"fork":false,"pushed_at":"2025-03-30T19:26:24.000Z","size":116,"stargazers_count":50,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-09T22:26:47.393Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/piotrmurach.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","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,"zenodo":null},"funding":{"github":"piotrmurach"}},"created_at":"2022-07-04T13:42:49.000Z","updated_at":"2025-10-09T14:14:01.000Z","dependencies_parsed_at":"2024-01-07T21:02:32.236Z","dependency_job_id":"4b4dcf78-4766-4a46-b63f-6e88aa76c9ac","html_url":"https://github.com/piotrmurach/slideck","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/piotrmurach/slideck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Fslideck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Fslideck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Fslideck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Fslideck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","download_url":"https://codeload.github.com/piotrmurach/slideck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Fslideck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279177944,"owners_count":26120073,"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","status":"online","status_checked_at":"2025-10-16T02:00:06.019Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2025-06-12T13:09:24.678Z","updated_at":"2025-10-24T08:20:30.101Z","avatar_url":"https://github.com/piotrmurach.png","language":"Ruby","funding_links":["https://github.com/sponsors/piotrmurach"],"categories":["\u003ca name=\"office\"\u003e\u003c/a\u003eOffice tools"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/piotrmurach/slideck/blob/master/assets/slideck_logo.svg\"\n       width=\"360\" alt=\"slideck logo\"/\u003e\n\u003c/div\u003e\n\n# Slideck\n\n[![Gem Version](https://badge.fury.io/rb/slideck.svg)][gem]\n[![Actions CI](https://github.com/piotrmurach/slideck/actions/workflows/ci.yml/badge.svg)][gh_actions_ci]\n[![Build status](https://ci.appveyor.com/api/projects/status/kvlo53t54qimbfqy?svg=true)][appveyor]\n[![Maintainability](https://api.codeclimate.com/v1/badges/c96e8367481519c38a06/maintainability)][codeclimate]\n[![Coverage Status](https://coveralls.io/repos/github/piotrmurach/slideck/badge.svg)][coverage]\n\n[gem]: https://badge.fury.io/rb/slideck\n[gh_actions_ci]: https://github.com/piotrmurach/slideck/actions/workflows/ci.yml\n[appveyor]: https://ci.appveyor.com/project/piotrmurach/slideck\n[codeclimate]:https://codeclimate.com/github/piotrmurach/slideck/maintainability\n[coverage]: https://coveralls.io/github/piotrmurach/slideck\n\n\u003e Terminal tool for presenting Markdown-powered slide decks.\n\n## Features\n\n* Write slides in the **Markdown** with extended syntax.\n* Show code snippets in [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks).\n* Syntax highlight code for [over 200 languages](https://github.com/rouge-ruby/rouge/blob/master/docs/Languages.md).\n* Create Markdown [tables](https://www.markdownguide.org/extended-syntax/#tables) with advanced formatting.\n* [Align](#21-align) slide content with familiar CSS syntax.\n* Add [margin](#23-margin) around content for all or a single slide.\n* Track progress through the slides with a [pager](#24-pager).\n* Display a [footer](#22-footer) at the bottom of every slide.\n* Apply custom [symbols](#25-symbols) and style [theme](#26-theme) to content.\n* Auto reload presentation when a file with slides changes.\n\n## Installation\n\n**Slideck** will work with any version of Ruby greater than or equal to `2.0`.\nRead [Installing Ruby](https://www.ruby-lang.org/en/documentation/installation/)\nguide to choose the best installation method.\n\nOnce Ruby is set up, install the `slideck` with:\n\n```shell\n$ gem install slideck\n```\n\n## Contents\n\n* [1. Usage](#1-usage)\n* [2. Configuration](#2-configuration)\n  * [2.1 align](#21-align)\n  * [2.2 footer](#22-footer)\n  * [2.3 margin](#23-margin)\n  * [2.4 pager](#24-pager)\n  * [2.5 symbols](#25-symbols)\n  * [2.6 theme](#26-theme)\n\n## 1. Usage\n\nOpen a text file and start writing slides in Markdown. Begin the document\nby adding configuration for all slides in `YAML` format. Then to denote\na slide, separate its content with three dashes. Use the same configuration\nsettings to override the global settings for a slide. To do so, specify\nsettings with `YAML` flow mappings after the slide separator.\n\nHere's a sample of a few slides with global and slide-specific configuration\nsettings:\n\n````markdown\nalign: center\nmargin: 2 5\nfooter:\n  align: center bottom\n  text: Footer content\n\n--- margin: 0\n\n# Welcome to Slideck\n\n## Built with TTY Toolkit\n\n--- align: center top\n\n# Code Block\n\n```ruby\nputs \"Welcome to Slideck\"\n```\n\n--- theme: {list: magenta}\n\n# Unordered List\n\n- Item 1\n- Item 2\n- Item 3\n\n--- symbols: ascii\n\n# Table\n\n| A | B | C |\n|---|---|---|\n| a | b | c |\n| a | b | c |\n| a | b | c |\n\n--- {pager: false, footer: false}\n\n# The End\n````\n\nTo start presenting, for example, `slides.md` file in a terminal:\n\n```shell\n$ slideck slides.md\n```\n\nUse the `-h` or `--help` flag to see help about available presentation\ncontrols and options:\n\n```shell\n$ slideck --help\n```\n\nUse the `-w` or `--watch` flag to automatically reload the presentation\nwith any update to the `slides.md` file:\n\n```shell\n$ slideck slides.md --watch\n```\n\n## 2. Configuration\n\nConfiguration options can be global or slide-specific.\n\nAdd global configuration options in `YAML` format at the beginning\nof a document.\n\nFor example, to configure [alignment](#21-align) and [margin](#23-margin)\nfor all slides:\n\n```markdown\nalign: center\nmargin: 2 5\n\n---\n\nFirst Slide\n\n---\n\nSecond Slide\n\n---\n```\n\nUse `YAML` flow mappings syntax to change the global configuration for a given\nslide. This format is a series of key/value pairs separated by commas and\nsurrounded by curly braces. The semicolon with space follows a key and splits\nit from value. Braces are optional for a single key/value pair.\nA slide-specific configuration follows three dashes and needs to be on\nthe same line.\n\nFor example, to override [alignment](#21-align) and [margin](#23-margin)\nfor a given slide:\n\n```markdown\nalign: center\nmargin: 2 5\n\n--- margin: 0\n\nFirst Slide\n\n--- {align: center top, margin: 1 3}\n\nSecond Slide\n\n---\n```\n\n### 2.1 Align\n\n**Slideck** draws the slide's content from the left top of the terminal screen\nby default. It positions the pager at the bottom right corner. When given, the\nfooter ends up at the bottom left corner. Use the `:align` configuration to\nchange the default positioning of content, [footer](#22-footer) and\n[pager](#24-pager).\n\nThe `align` configuration takes either one or two values. The first value\nspecifies the horizontal alignment out of `left`, `center` and `right`.\nThe second value describes vertical alignment out of the `top`, `center`\nand `bottom`. Skipping the second value will default the vertical alignment\nto the `center`. Use a space, comma or both to separate two values.\n\nFor example, to position content at the top center of the screen\non every slide:\n\n```yaml\nalign: center top\n```\n\nOr use shorthand to place content at the center left on every slide:\n\n```yaml\nalign: left\n```\n\nUse the same configuration to change the alignment for a single slide. It\nneeds to follow after the slide separator and be on the same line.\n\nFor example, to place a given slide at the bottom left:\n\n```yaml\n--- align: left bottom\n```\n\n### 2.2 Footer\n\n**Slideck** doesn't show the footer by default. Use the `:footer` configuration\nto add content to the bottom left of the screen for every slide.\n\nFor example, to display a footer on every slide:\n\n```yaml\nfooter: Footer content\n```\n\nThe footer supports `Markdown` syntax:\n\n```yaml\nfooter: **bold** content\n```\n\nThe footer can also span more than one line:\n\n```yaml\nfooter: \"first line\\nsecond line\\nthird line\"\n```\n\nUse the `:align` key to change the footer alignment and the `:text` key\nto specify its content.\n\nFor example, to specify a global footer at the bottom center of every slide:\n\n```yaml\nfooter:\n  align: center bottom\n  text: Footer content\n```\n\nUse the same configuration to change the footer for a single slide. It needs\nto follow after the slide separator and be on the same line.\n\nFor example, to place a footer at the bottom center of the screen:\n\n```yaml\n--- footer: {align: center bottom, text: Footer content}\n```\n\nOr, use a `false` value to hide a footer for a single slide:\n\n```yaml\n--- footer: false\n```\n\n### 2.3 Margin\n\nThe `margin` specifies a distance from all four sides of the terminal screen.\nIt follows CSS rules and can have one, two, three or four integer values. Use\na space or comma to separate each integer value.\n\nThe following are all possible ways to specify a margin:\n\n```yaml\nmargin: 1         # the same margin of 1 for all sides\nmargin: 1 2       # 1 to the top and bottom, and 2 to the left and right\nmargin: 1 2 3     # 1 to the top, 2 to the left and right, and 3 to the bottom\nmargin: 1 2 3 4   # 1 to the top, 2 to the right, 3 to the bottom, 4 to the left\n```\n\nOr, specify a margin with explicit side names:\n\n```yaml\nmargin:\n  top: 1\n  right: 2\n  bottom: 3\n  left: 4\n```\n\nLike shorthand notation, specify names only for the configured sides.\n\nFor example, to add only the top margin and leave all the other sides with\ntheir default values:\n\n```yaml\nmargin:\n  top: 1\n```\n\nUse the same configuration to change the margin for a single slide. It needs\nto follow after the slide separator and be on the same line.\n\nFor example, to zero out the margin for a given slide:\n\n```yaml\n--- margin: 0\n```\n\n### 2.4 Pager\n\n**Slideck** displays the `pager` in the bottom right corner of the terminal\nscreen. The display format is `%\u003cpage\u003ed / %\u003ctotal\u003ed`, where the first\nplaceholder represents the current slide and the second is the total\nnumber of slides.\n\nFor example, to change the pager display:\n\n```yaml\npager: \"Page %\u003cpage\u003ed of %\u003ctotal\u003ed\"\n```\n\nThe pager supports `Markdown` syntax:\n\n```yaml\npager: \"**Bold** %\u003ctotal\u003e pages\"\n```\n\nThe pager can also span more than one line:\n\n```yaml\npager: \"Page\\n%\u003cpage\u003ed\\nof\\n%\u003ctotal\u003ed\"\n```\n\nUse the `:align` key to change the pager alignment and the `:text` key\nto specify its content.\n\nFor example, to place the pager at the bottom center of every slide:\n\n```yaml\npager:\n  align: center bottom\n  text: \"Page %\u003cpage\u003ed of %\u003ctotal\u003ed\"\n```\n\nOr, use a `false` value to hide a pager on all slides:\n\n```yaml\npager: false\n```\n\nUse the same configuration to change the pager for a single slide. It needs\nto follow after the slide separator and be on the same line.\n\nFor example, to place a pager at the bottom center of a given slide:\n\n```yaml\n--- pager: {align: center bottom, text: \"Page %\u003cpage\u003ed of %\u003ctotal\u003ed\"}\n```\n\nOr, use a `false` value to hide a pager for a single slide:\n\n```yaml\n--- pager: false\n```\n\n### 2.5 Symbols\n\n**Slideck** decorates `Markdown` elements with `unicode` symbols by default.\nUse the `:symbols` configuration to change the display of decorative\ncharacters. It takes either a single value or key/value pairs. The single\nvalue specifies a character set out of `ascii` or `unicode`. The key/value\npairs accept the `:base` and `:override` keys. Like a single value,\nthe `:base` key takes either `ascii` or `unicode`.\n\nFor example, to change the default symbols for all slides to `ascii`:\n\n```yaml\nsymbols: ascii\n```\n\nOr, use the `:base` key to specify the `ascii` character set:\n\n```yaml\nsymbols:\n  base: ascii\n```\n\nThe `:override` key accepts key/value pairs, where the key is a symbol name\nand the value is a decorative character. Please see the\n[tty-markdown](https://github.com/piotrmurach/tty-markdown#24-symbols)\nfor a complete list of symbols.\n\nFor example, to change the `:bullet` symbol for every slide:\n\n```yaml\nsymbols:\n  override:\n    bullet: x\n```\n\nUse the same configuration to change the symbols for a single slide. It needs\nto follow after the slide separator and be on the same line.\n\nFor example, to change a character set to `ascii` for a single slide:\n\n```yaml\n--- symbols: ascii\n```\n\nOr, to change the `:bullet` symbol for a single slide:\n\n```yaml\n--- symbols: {override: {bullet: x}}\n```\n\n### 2.6 Theme\n\n**Slideck** displays `Markdown` elements with a default style theme. Use\nthe `:theme` configuration to change individual element styles. It takes\nkey/value pairs where the key is the element name, and the value is a single\nstyle or list of styles. Please see the\n[tty-markdown](https://github.com/piotrmurach/tty-markdown#22-theme)\nfor a complete list of element names and their styles.\n\nFor example, to change `em`, `link` and `list` element styles for every slide:\n\n```yaml\ntheme:\n  em: blue\n  link: cyan\n  list: magenta\n```\n\nUse the same configuration to change the theme for a single slide. It needs\nto follow after the slide separator and be on the same line.\n\nFor example, to change `em`, `link` and `list` element styles for\na single slide:\n\n```yaml\n--- theme: {em: blue, link: cyan, list: magenta}\n```\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies.\nThen, run `rake spec` to run the tests. You can also run `bin/console`\nfor an interactive prompt that will allow you to experiment.\n\nTo install this gem onto your local machine, run `bundle exec rake install`.\nTo release a new version, update the version number in `version.rb`, and then\nrun `bundle exec rake release`, which will create a git tag for the version,\npush git commits and the created tag, and push the `.gem` file to\n[rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at\nhttps://github.com/piotrmurach/slideck. This project is intended to be a safe,\nwelcoming space for collaboration, and contributors are expected to adhere to\nthe [code of conduct](https://github.com/piotrmurach/slideck/blob/master/CODE_OF_CONDUCT.md).\n\n## License\n\nThe gem is available as open source under the terms of the\n[GNU Affero General Public License v3.0](https://opensource.org/licenses/AGPL-3.0).\n\n## Code of Conduct\n\nEveryone interacting in the Slideck project's codebases, issue trackers, chat\nrooms and mailing lists is expected to follow the\n[code of conduct](https://github.com/piotrmurach/slideck/blob/master/CODE_OF_CONDUCT.md).\n\n## Copyright\n\nCopyright (c) 2022 Piotr Murach. See [LICENSE.txt](LICENSE.txt) for further\ndetails.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiotrmurach%2Fslideck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpiotrmurach%2Fslideck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiotrmurach%2Fslideck/lists"}