A beautiful Syntax Highlighter.

Overview

Shiki

Shiki is a beautiful Syntax Highlighter. Demo.

Usage

npm i shiki
const shiki = require('shiki')

shiki
  .getHighlighter({
    theme: 'nord'
  })
  .then(highlighter => {
    console.log(highlighter.codeToHtml(`console.log('shiki');`, { lang: 'js' }))
  })

// <pre class="shiki" style="background-color: #2e3440"><code>
//   <!-- Highlighted Code -->
// </code></pre>
<script src="https://unpkg.com/shiki"></script>
<script>
  shiki
    .getHighlighter({
      theme: 'nord'
    })
    .then(highlighter => {
      const code = highlighter.codeToHtml(`console.log('shiki');`, { lang: 'js' })
      document.getElementById('output').innerHTML = code
    })
</script>

Clone shikijs/shiki-starter to play with Shiki, or try it out on Repl.it.

Seen

Contributing

See the Contributing Guide.

Credits

Sponsorship

If you find Shiki useful, please consider sponsoring my Open Source development. Thank you 🙏

https://github.com/sponsors/octref

License

MIT © Pine Wu

Comments
  • [Shiki] no CDN provider found

    [Shiki] no CDN provider found

    code

    import * as shiki from 'shiki';
    
    const html = ref('');
    shiki
      .getHighlighter({
        theme: props.theme,
      })
      .then((highlighter) => {
        html.value = highlighter.codeToHtml(props.content, props.lang);
      })
      .catch(console.warn);
    

    result

    [Shiki] no CDN provider found, use `setCDN()` to specify the CDN for loading the resources before calling `getHighlighter()`
    
    need-more-info 
    opened by jiankafei 17
  • Add CodeSandbox interactive demo (with Next.js)

    Add CodeSandbox interactive demo (with Next.js)

    Hi @octref ! 👋

    I have been considering different highlighting options (also Prism.js with react-syntax-highlighter), and stumbled upon your project through Orta (who used it for the shiki-twoslash package for the TypeScript website)

    One thing that I was looking for when going through this repo and also the docs website was an interactive demo.

    I've set one up on CodeSandbox (with Next.js). It is currently a frozen sandbox (so that I remember to not accidentally make changes to it), but of course happy to have you fork it so that you control the sandbox.

    What are your thoughts?

    opened by karlhorky 12
  • Bundling for browser usage

    Bundling for browser usage

    Hi, not really an issue, just wondering if it's actually possible to use Shiki in browser instead of node? I have tried to bundle it with webpack and https://github.com/Jam3/babel-plugin-static-fs plugin, but still getting errors related to fs module calls for Onigasm and etc.

    feature-request help-wanted 
    opened by ghost 12
  • Implement support for adding custom CSS classes to specific lines

    Implement support for adding custom CSS classes to specific lines

    In this PR, I'm implementing support for adding custom CSS classes to specific lines. This is picking up the work that @dceddia started in #83.

    API

    The codeToHtml now accepts an optional options object with an optional highlightedLines property:

    function codeToHtml(
      code: string,
      lang?: StringLiteralUnion<Lang>,
      theme?: StringLiteralUnion<Theme>,
      options?: HtmlOptions
    ): string {
      // ...
    }
    
    export interface HtmlOptions {
      highlightedLines?: HighlightedLines
    }
    

    Highlighted lines can be specified one by one, or as a range of lines:

    type LineNumber = number
    type LineNumberRange = [fromLine: number, toLine: number]
    
    export type HighlightedLines = (LineNumber | LineNumberRange)[]
    

    Example

    Here's an example usage that would highlight lines 1, 3, 4, 5, 6, and 8:

    const code = `
    console.log('line 1');
    console.log('line 2');
    console.log('line 3');
    console.log('line 4');
    console.log('line 5');
    console.log('line 6');
    console.log('line 7');
    console.log('line 8');
    console.log('line 9');
    `.trim()
    
    const html = highlighter.codeToHtml(code, 'js', 'css-variables', {
      highlightedLines: [1, [3, 6], 8]
    })
    

    And here's the corresponding HTML output:

    <pre class="shiki" style="background-color: var(--shiki-color-background)"><code><span class="line highlighted"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 1&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 2&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line highlighted"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 3&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line highlighted"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 4&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line highlighted"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 5&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line highlighted"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 6&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 7&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line highlighted"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 8&#39;</span><span style="color: var(--shiki-color-text)">);</span></span>
    <span class="line"><span style="color: var(--shiki-token-constant)">console</span><span style="color: var(--shiki-token-function)">.log</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">&#39;line 9&#39;</span><span style="color: var(--shiki-color-text)">);</span></span></code></pre>
    

    Feedback

    Feedback is more than welcome, I'm happy to iterate on this as necessary :)

    opened by mariusschulz 10
  • feat: path renderer

    feat: path renderer

    • [x] This PR fixes #255

    I'm not sure it's suitable to make changes on renderer-svg directly(seems like a breaking change), so I made a copy of it.

    The main changes are:

    • use opentype.js to measure font width, so we need to pass a font file path, or font file buffer (~~could not use css font-family directly~~, fetch the font file and convert to ArrayBuffer first)
    • embedded font, more portable, but not copiable 😢
    • render to image using something like node-canvas, so we don't need to install a browser (not implemented yet)
    opened by tmkx 10
  • Add

    Add "css-variables" theme, support dark mode

    • Adds local "css-variables.json" theme
    • Adds documentation for this theme, and dark mode support in general
      • (feel free to make any changes to docs as you see fit!)
    • Closes (potentially) #33 ?
    opened by FredKSchott 10
  • Usage with Next.js SSR

    Usage with Next.js SSR

    First of all: Thanks so much for creating this great library. I've spend too many hours trying to configured Monaco to get VSC themes working before I found Shiki. 😅

    I'm trying to use Shiki in a Next.js app using Next.js' SSR feature via getStaticProps. Everything works great during local development (via next dev) however the app breaks in production after running next build (which bundled the app) resulting in errors like these:

    image

    The reason for this is that Shiki dynamically tries to access the theme/grammar files using the fs Node package. However these resources are no longer available after the next build step. Next.js uses nft to automatically detect and bundle assets. It would be great if Shiki could access the required assets in a way that nft can understand it and it therefore works with Next.js.

    As a temporary workaround I'm doing the following:

    const theme = require('shiki/themes/github-light.json')
    const grammar = require('shiki/languages/tsx.tmLanguage.json')
    
    const highlighter = await getHighlighter({
      theme,
      langs: [{ id: 'tsx', scopeName: 'source.tsx', grammar }],
    })
    
    invalid 
    opened by schickling 10
  • Colors don’t match VS Code

    Colors don’t match VS Code

    Consider the following:

    const shiki = require('shiki')
    
    shiki.getHighlighter({
      theme: 'light_plus'
    }).then(highlighter => {
      console.log(highlighter.codeToHtml(`return 'shiki';`, 'js'))
    })
    

    This is the result I’m getting:

    <pre class="shiki" style="background-color: #fff"><code><span style="color: #0000FF">return</span><span style="color: #000000"> </span><span style="color: #A31515">'shiki'</span><span style="color: #000000">;</span></code></pre>
    
    Screen Shot 2020-03-10 at 12 02 12 AM

    But this is what I see in VS Code using the same theme:

    Screen Shot 2020-03-10 at 12 03 10 AM

    (Note the color of the return keyword.)

    bug 
    opened by leafac 10
  • fix: corrected introduced loader issue / fixes jsDelivr and unpkg bundles

    fix: corrected introduced loader issue / fixes jsDelivr and unpkg bundles

    @orta Unfortunately I introduced a bug with/for 0.12.0 that breaks browser environments.

    While I was there I at least fixed the Rollup builds (back to the state of bundling like 0.10.1), so that unpkg and jsDelivr are working agin. This fixes #338 and fixes #365

    opened by muenzpraeger 9
  • Error: No grammar provided for <insert-lang-here>

    Error: No grammar provided for

    I'm trying to get async loading working properly for all languages supported by Shiki in showcode.app, but it seems some languages have issues and others do not. The issue is completely sporadic, even on the Shiki playground I receive this issue:

    Screen Shot 2021-11-17 at 8 54 30 AM

    Screen Shot 2021-11-17 at 8 57 54 AM

    If you start clicking languages randomly, you'll eventually receive this error.

    I haven't been able to track it down properly. My shiki highlighter instance is a singleton shared throughout my application, and when the languages load properly, they do stay loaded.

    Can anyone point me in the direction of a potential fix? I've been digging through the source and trying to find potential issues, but my JS knowledge is certainly lacking.

    Any help is greatly appreciated! ❤️ Thank you so much for this amazing tool.

    need-more-info 
    opened by stevebauman 9
  • Can't import to React

    Can't import to React

    Hi, I am not able to import shiki into a react app. I am getting Uncaught TypeError: fs.readFileSync is not a function error. Here's my code for reference.

    import './App.css'
    import { useEffect, useState } from 'react'
    import  shiki  from 'shiki'
    
    shiki.getHighlighter({
      theme: 'nord'
    }).then(highlighter => {
      console.log(highlighter.codeToHtml(`console.log('shiki');`, 'js'))
    })
    ...
    
    bug 
    opened by onattech 9
  • Odd highlighting for shellscript which does not match VSCode

    Odd highlighting for shellscript which does not match VSCode

    Running the below repro:

    // @ts-check
    const fs = require("fs");
    const s = require("shiki");
    
    async function main() {
        const h = await s.getHighlighter({
            langs: ["shellscript"],
            themes: ["github-light"],
        });
    
        const html = h.codeToHtml("npm i your-dependency", { lang: "shellscript" });
    
        fs.writeFileSync("test.html", html);
    }
    
    main();
    

    Highlights as:

    image

    While in VSCode it highlights as:

    image

    This broke with an upgrade from ^0.11.1 to ^0.12.1

    Ref: https://github.com/TypeStrong/typedoc/issues/2139

    opened by Gerrit0 1
  • Is shiki safe to use alongside a v-html directive?

    Is shiki safe to use alongside a v-html directive?

    Eslint is warning me of possible XSS attack because of the use of v-html

    So i'm wondering, if I'm using the output of shiki (python + github theme) directly as the input of a v-html directive, is there a risk?

    opened by remiconnesson 1
  • wasm file streaming issue

    wasm file streaming issue

    Updating to 12 introduced an error for me and I wanted to share it in case others encounter it. I'm not sure how widespread this occurs.

    Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.

    The change is from using a Response object (here) instead of an ArrayBuffer, which as you know is handled differently by oniguruma

    Using the advice in the readme works:

    const wasmBuffer = await fetch('/your/path/onig.wasm').then(res => res.arrayBuffer())
    setWasm(wasmBuffer)
    
    opened by KevinBatdorf 4
  • Can't load shiki vscode-oniguruma in Next 13 react server component

    Can't load shiki vscode-oniguruma in Next 13 react server component

    I'm trying to use Shiki in a react server component; however, the oniguruma wasm file can't be found. I've tried setting the wasm path; however, when reading through the documentation, this isn't possible for the node.js environment.

    Issue:

    error - unhandledRejection: Error: ENOENT: no such file or directory, open '(sc_server)\node_modules\vscode-oniguruma\release\onig.wasm'
        at Object.openSync (node:fs:590:3)
        at Object.readFileSync (node:fs:458:35)
        at getOniguruma (webpack-internal:///(sc_server)/./node_modules/shiki/dist/index.js:2178:32)
        at Object.getHighlighter (webpack-internal:///(sc_server)/./node_modules/shiki/dist/index.js:2682:36)
        at getHighlighter (webpack-internal:///(sc_server)/./markdown.plugins.mjs:45:66)
        at Function.rehypePrettyCode (webpack-internal:///(sc_server)/./node_modules/rehype-pretty-code/dist/rehype-pretty-code.js:30114:45)
        at Function.freeze (webpack-internal:///(sc_server)/./node_modules/unified/lib/index.js:117:74)
        at Function.process (webpack-internal:///(sc_server)/./node_modules/unified/lib/index.js:308:19)
        at parseMarkdown (webpack-internal:///(sc_server)/./src/app/(website)/packages/[repository_type]/[...package_route]/page.tsx:52:31)
        at Page (webpack-internal:///(sc_server)/./src/app/(website)/packages/[repository_type]/[...package_route]/page.tsx:86:24)
        at processTicksAndRejections (node:internal/process/task_queues:96:5) {
      errno: -4058,
      syscall: 'open',
      code: 'ENOENT',
      path: '(sc_server)\\node_modules\\vscode-oniguruma\\release\\onig.wasm'
    }
    

    What I've tried to do to resolve it:

    1. Copy onig.wasm to my src folder
    2. Try to load onig.wasm in the shiki.getHighlighter options
    const highlighter = await shiki.getHighlighter({
        ...options,
        paths: {
          wasm: `${getShikiPath()}/onig.wasm`, // src/lib/mdx/shiki/onig.wasm
          languages: `${getShikiPath()}/languages/`,
          themes: `${getShikiPath()}/themes/`,
        },
      })
    

    Possible solutions:

    1. Might this be solved by allowing users to specify where to load the onig.wasm from in the node.js environment. (see the shiki.getHighlighter paths -> wasm section. (this option currently only works in browser environments*)
    opened by selenecodes 1
  • Mention shiki-es

    Mention shiki-es

    https://github.com/unjs/shiki-es

    I'm not really sure about us converting to ESM, because I don't really feel like I grok all the trade-offs and how to do backwards compat, but the README should mention this module as it's a good answer

    opened by orta 0
Releases(v0.12.0)
  • v0.12.0(Dec 18, 2022)

    Key Changes

    Updates to the core libraries used in Shiki, and a huge set of docs improvements.

    • feat: dependency updates incl. textmate by @muenzpraeger in https://github.com/shikijs/shiki/pull/377
    • feat: upgrade to vscode-textmate-v7. fix #343 by @octref in https://github.com/shikijs/shiki/pull/361
    • feat: resolve embedded languages automatically by @muenzpraeger in https://github.com/shikijs/shiki/pull/379

    What's Changed

    • Fix: fetchTheme theme 'include' directory joining for absolute paths by @Oblongmana in https://github.com/shikijs/shiki/pull/173
    • feat: update HCL grammar source by @dbanck in https://github.com/shikijs/shiki/pull/340
    • Add several alias of languages by @dannypsnl in https://github.com/shikijs/shiki/pull/344
    • feat: add proto grammar by @ruanspies in https://github.com/shikijs/shiki/pull/352
    • fix: add 'cs' alias for csharp and 'fs' alias for fsharp by @mysticmind in https://github.com/shikijs/shiki/pull/353
    • add imba as a shiki syntax by @haikyuu in https://github.com/shikijs/shiki/pull/363
    • feat(lang): Add V support + robot: update grammars by @wennerryle in https://github.com/shikijs/shiki/pull/374
    • feat: update/add language definitions by @muenzpraeger in https://github.com/shikijs/shiki/pull/378
    • feat: add documentation / optimize WASM loading by @muenzpraeger in https://github.com/shikijs/shiki/pull/384

    New Contributors

    • @Oblongmana made their first contribution in https://github.com/shikijs/shiki/pull/173
    • @dbanck made their first contribution in https://github.com/shikijs/shiki/pull/340
    • @dannypsnl made their first contribution in https://github.com/shikijs/shiki/pull/344
    • @ruanspies made their first contribution in https://github.com/shikijs/shiki/pull/352
    • @haikyuu made their first contribution in https://github.com/shikijs/shiki/pull/363
    • @wennerryle made their first contribution in https://github.com/shikijs/shiki/pull/374
    • @muenzpraeger made their first contribution in https://github.com/shikijs/shiki/pull/377

    Full Changelog: https://github.com/shikijs/shiki/compare/v0.11.0...v0.12.0

    Source code(tar.gz)
    Source code(zip)
  • v0.10.1(Feb 17, 2022)

    What's Changed

    New Languages

    • feat: add stata lang by @kylebutts in https://github.com/shikijs/shiki/pull/281
    • feat: add rel lang by @robbear in https://github.com/shikijs/shiki/pull/287
    • feat: add marko language by @manan-gup in https://github.com/shikijs/shiki/pull/299
    • feat: Add ZenScript support by @jaredlll08 in https://github.com/shikijs/shiki/pull/300

    New Themes

    • feat: add rose pine themes by @EmeraldSnorlax in https://github.com/shikijs/shiki/pull/282

    Fixes

    • fix: updated astro grammar source by @JuanM04 in https://github.com/shikijs/shiki/pull/293
    • Split plaintext code into lines by @silvenon in https://github.com/shikijs/shiki/pull/298

    Docs

    • docs: add Code Hike to "Seen" by @pomber in https://github.com/shikijs/shiki/pull/284
    • fix(docs): fixed custom language instructions by @JuanM04 in https://github.com/shikijs/shiki/pull/294

    New Contributors

    • @kylebutts made their first contribution in https://github.com/shikijs/shiki/pull/281
    • @EmeraldSnorlax made their first contribution in https://github.com/shikijs/shiki/pull/282
    • @robbear made their first contribution in https://github.com/shikijs/shiki/pull/287
    • @JuanM04 made their first contribution in https://github.com/shikijs/shiki/pull/293
    • @silvenon made their first contribution in https://github.com/shikijs/shiki/pull/298
    • @manan-gup made their first contribution in https://github.com/shikijs/shiki/pull/299
    • @jaredlll08 made their first contribution in https://github.com/shikijs/shiki/pull/300

    Full Changelog: https://github.com/shikijs/shiki/compare/v0.10.0...v0.10.1

    Source code(tar.gz)
    Source code(zip)
Owner
Shiki
A beautiful Syntax Highlighter.
Shiki
An experimental syntax highlighter web app bot based on Telegram's WebApp update.

Syntax Highlighter WebApp Inspired by zubiden/tg-web-bot-demo. Try the demo bot running here: @syntaxyybot Recently Telegram released a big update for

Dunkan 12 Nov 8, 2022
✏️ Super lightweight JSX syntax highlighter, around 1KB after minified and gzipped

Sugar High Introduction Super lightweight JSX syntax highlighter, around 1KB after minified and gzipped Usage npm install --save sugar-high import { h

Jiachi Liu 67 Dec 8, 2022
Syntax Highlighter supporting multiple languages, themes, fonts, highlighting from a URL, local file or post text.

Crayon Syntax Highlighter Supports multiple languages, themes, fonts, highlighting from a URL, local file or post text. Written in PHP and jQuery. Cra

Aram Kocharyan 1.1k Nov 26, 2022
A refined tool for exploring open-source projects on GitHub with a file tree, rich Markdown and image previews, multi-pane multi-tab layouts and first-class support for Ink syntax highlighting.

Ink codebase browser, "Kin" ?? The Ink codebase browser is a tool to explore open-source code on GitHub, especially my side projects written in the In

Linus Lee 20 Oct 30, 2022
Small library to create classes without using class syntax.

Clazz.js Small library to create classes without using class syntax. Compatibility For internet explorer 11 or higher. Example <script src="Clazz.js">

Emanuel R. Vásquez 1 Dec 25, 2021
Starting template for building a Remix site with CloudFlare Workers (ES Modules Syntax)

Starting template for building a Remix site with CloudFlare Workers (ES Modules Syntax)

null 12 May 20, 2022
Combine type and value imports using Typescript 4.5 type modifier syntax

type-import-codemod Combines your type and value imports together into a single statement, using Typescript 4.5's type modifier syntax. Before: import

Ian VanSchooten 4 Sep 29, 2022
Alfred Workflow for selecting citations in Pandoc Syntax from a BibTeX File.

Supercharged Citation Picker A citation picker for academics that write in markdown. Using Alfred, this citation picker inserts Pandoc citations from

pseudometa 69 Dec 29, 2022
A small javascript DOM manipulation library based on Jquery's syntax. Acts as a small utility library with the most common functions.

Quantdom JS Quantdom is a very small (about 600 bytes when ran through terser & gzipped) dom danipulation library that uuses a Jquery like syntax and

Sean McQuaid 7 Aug 16, 2022
Markdoc is a Markdown-based syntax and toolchain for creating custom documentation sites and experiences.

A powerful, flexible, Markdown-based authoring framework. Markdoc is a Markdown-based syntax and toolchain for creating custom documentation sites and

Markdoc 5.8k Jan 2, 2023
Syntax highlighting, like GitHub

Close up of The Starry Night by Vincent van Gogh (1889) with examples of starry-night over it starry-night Syntax highlighting, like what GitHub uses

Titus 585 Dec 21, 2022
A simple Node.js package that helps you not to look up JavaScript promise syntax every time you use it.

A simple Node.js package that helps you not to look up JavaScript promise syntax every time you use it. Simple: Provides abstraction of the promise sy

Saad Irfan ⚡️ 9 Oct 8, 2022
A remake of the previous project (awsm-books) using proper ES6 syntax.

Awesome-Books-ES6 A remake of the previous project (awsm-books) using proper ES6 syntax. Built With: HTML CSS SCSS JavaScript Live Demo: Live Demo Get

Gabriel Fonseca 4 Jun 23, 2022
this project is an online library application that enables users to keep track of books in their library by adding to and removing books from a list. Built with JavaScript ES6 syntax, HTML, and CSS

Awesome-Book1 The aim of this project is to restructure the Awesome books app code by using ES6 syntax and organising the workspace using modules. The

Afolabi Akorede 7 Jul 17, 2022
A tiny, plugin extendable JavaScript utility library with a JQuery-like syntax.

Tiny Friggin' Utility Zapper What is it? A tiny ~7kb extendable JavaScript utility library with a JQuery like syntax for getting work done fast! If yo

Bret 4 Jun 25, 2022
Unofficial Library for using Discord.JS with JSX Syntax.

@chooks22/discord.jsx WARNING! This project is in very early stage of development. And while I do have plans to finish it to completion, consider this

Chooks22 4 Nov 14, 2022
Render (GitHub Flavoured with syntax highlighting) Markdown, and generate CSS for each of GitHub’s themes.

render-gfm Render (GitHub Flavoured with syntax highlighting) Markdown, and generate CSS for each of GitHub’s themes. GitHub Repository npm Package Do

Shaun Bharat 12 Oct 10, 2022
The aim of this project is to restructure the Awesome books app code by using ES6 syntax and organising the workspace using modules.

Awesome-Books-ES6 The aim of this project is to restructure the Awesome books app code by using ES6 syntax and organising the workspace using modules.

Favour Ezeugwa 15 Aug 18, 2022