glow Documentation

Render markdown on the CLI, with pizzazz! ๐Ÿ’…๐Ÿป

27,743 stars Go Go 1 file ยท ~1,891 tokens #cli#excitement#hacktoberfest#markdown
RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy glow on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name glow --restart always charmbracelet/glow:latest

File: Taskfile.yaml

https://taskfile.dev

version: '3'

tasks:
lint:
desc: Run base linters
cmds:
- golangci-lint run

test:
desc: Run tests
cmds:
- go test ./... {{.CLI_ARGS}}

log:
desc: Watch for glow logs
aliases: [tail]
cmds:
- cmd: tail -f ~/Library/Caches/glow/glow.log
platforms: [darwin]
- cmd: tail -f ~/.cache/glow/glow.log
platforms: [linux, windows]


File: .golangci.yml

version: "2"
run:
tests: false
linters:
enable:
- bodyclose
- exhaustive
- goconst
- godot
- gomoddirectives
- goprintffuncname
- gosec
- misspell
- nakedret
- nestif
- nilerr
- noctx
- nolintlint
- prealloc
- revive
- rowserrcheck
- sqlclosecheck
- tparallel
- unconvert
- unparam
- whitespace
- wrapcheck
exclusions:
rules:
- text: '(slog|log).\w+'
linters:
- noctx
generated: lax
presets:
- common-false-positives
issues:
max-issues-per-linter: 0
max-same-issues: 0
formatters:
enable:
- gofumpt
- goimports
exclusions:
generated: lax


File: .goreleaser.yml

yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json

version: 2

includes:

  • from_url:
    url: charmbracelet/meta/main/goreleaser-glow.yaml

variables:
github_url: "https://github.com/charmbracelet/glow"
maintainer: "Christian Muehlhaeuser [email protected]"
brew_commit_author_name: "Christian Muehlhaeuser"
brew_commit_author_email: "[email protected]"


File: .github/dependabot.yml

version: 2

updates:

  • package-ecosystem: "gomod"
    directory: "/"
    schedule:
    interval: "monthly"
    labels:

    • "dependencies"
      commit-message:
      prefix: "chore"
      include: "scope"
      groups:
      all:
      patterns:
      • "*"
        ignore:
    • dependency-name: github.com/charmbracelet/bubbletea/v2
      versions:
      • v2.0.0-beta1
  • package-ecosystem: "github-actions"
    directory: "/"
    schedule:
    interval: "monthly"
    labels:

    • "dependencies"
      commit-message:
      prefix: "chore"
      include: "scope"
      groups:
      all:
      patterns:
      • "*"
  • package-ecosystem: "docker"
    directory: "/"
    schedule:
    interval: "monthly"
    labels:

    • "dependencies"
      commit-message:
      prefix: "chore"
      include: "scope"
      groups:
      all:
      patterns:
      • "*"

File: .github/ISSUE_TEMPLATE/bug_report.md


name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''


Describe the bug
A clear and concise description of what the bug is.

Setup
Please complete the following information along with version numbers, if applicable.

  • OS [e.g. Ubuntu, macOS]
  • Shell [e.g. zsh, fish]
  • Terminal Emulator [e.g. kitty, iterm]
  • Terminal Multiplexer [e.g. tmux]
  • Locale [e.g. en_US.UTF-8, zh_CN.UTF-8, etc.]

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Source Code
Please include source code if needed to reproduce the behavior.

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
Add screenshots to help explain your problem.

Additional context
Add any other context about the problem here.


File: .github/ISSUE_TEMPLATE/config.yml

blank_issues_enabled: true
contact_links:


File: .github/ISSUE_TEMPLATE/feature_request.md


name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''


Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.


File: .github/workflows/build.yml

name: build

on: [push, pull_request]

jobs:
build:
uses: charmbracelet/meta/.github/workflows/build.yml@main

snapshot:
uses: charmbracelet/meta/.github/workflows/snapshot.yml@main
secrets:
goreleaser_key: ${{ secrets.GORELEASER_KEY }}

govulncheck:
uses: charmbracelet/meta/.github/workflows/govulncheck.yml@main
with:
go-version: stable

semgrep:
uses: charmbracelet/meta/.github/workflows/semgrep.yml@main

ruleguard:
uses: charmbracelet/meta/.github/workflows/ruleguard.yml@main
with:
go-version: "1.26"


File: .github/workflows/coverage.yml

name: coverage
on: [push, pull_request]

jobs:
coverage:
runs-on: ubuntu-latest
env:
GO111MODULE: "on"
steps:
- name: Checkout code
uses: actions/checkout@v7

text
- name: Install Go
    uses: actions/setup-go@v7
    with:
      go-version: stable

  - name: Coverage
    env:
      COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    run: |
      go test -race -covermode atomic -coverprofile=profile.cov ./...
      go install github.com/mattn/goveralls@latest
      goveralls -coverprofile=profile.cov -service=github

File: .github/workflows/dependabot-sync.yml

name: dependabot-sync
on:
schedule:
- cron: "0 0 * * 0" # every Sunday at midnight
workflow_dispatch: # allows manual triggering

permissions:
contents: write
pull-requests: write

jobs:
dependabot-sync:
uses: charmbracelet/meta/.github/workflows/dependabot-sync.yml@main
with:
repo_name: ${{ github.event.repository.name }}
secrets:
gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}


File: .github/workflows/goreleaser.yml

yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json

name: goreleaser

on:
push:
tags:
- v*..

concurrency:
group: goreleaser
cancel-in-progress: true

jobs:
goreleaser:
uses: charmbracelet/meta/.github/workflows/goreleaser.yml@main
secrets:
docker_username: ${{ secrets.DOCKERHUB_USERNAME }}
docker_token: ${{ secrets.DOCKERHUB_TOKEN }}
gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
goreleaser_key: ${{ secrets.GORELEASER_KEY }}
fury_token: ${{ secrets.FURY_TOKEN }}
nfpm_gpg_key: ${{ secrets.NFPM_GPG_KEY }}
nfpm_passphrase: ${{ secrets.NFPM_PASSPHRASE }}
snapcraft_token: ${{ secrets.SNAPCRAFT_TOKEN }}


File: .github/workflows/lint-sync.yml

name: lint-sync
on:
schedule:
- cron: "0 0 * * 0" # every sunday at midnight
workflow_dispatch:

permissions:
contents: write
pull-requests: write

jobs:
lint:
uses: charmbracelet/meta/.github/workflows/lint-sync.yml@main


File: .github/workflows/lint.yml

name: lint
on:
push:
pull_request:

jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: golangci-lint
uses: golangci/[email protected]
with:
# Optional: golangci-lint command line arguments.
args: --issues-exit-code=0
# Optional: show only new issues if it's a pull request. The default value is false.
only-new-issues: true