Pug – robust, elegant, feature rich template engine for Node.js

Overview

Pug

Full documentation is at pugjs.org

Pug is a high-performance template engine heavily influenced by Haml and implemented with JavaScript for Node.js and browsers. For bug reports, feature requests and questions, open an issue. For discussion join the chat room.

You can test drive Pug online here.

Professionally supported pug is now available

Build Status Rolling Versions NPM version Join Gitter Chat

Dependency Status

Package Dependencies Dev Dependencies
mono-repo top Dependency Status devDependencies Status
pug Dependencies Status Dependencies Status
pug-attrs Dependencies Status Dependencies Status
pug-code-gen Dependencies Status Dependencies Status
pug-error Dependencies Status Dependencies Status
pug-filters Dependencies Status Dependencies Status
pug-lexer Dependencies Status Dependencies Status
pug-linker Dependencies Status Dependencies Status
pug-load Dependencies Status Dependencies Status
pug-parser Dependencies Status Dependencies Status
pug-runtime Dependencies Status Dependencies Status
pug-strip-comments Dependencies Status Dependencies Status
pug-walk Dependencies Status Dependencies Status

Rename from "Jade"

This project was formerly known as "Jade". However, it was revealed to us that "Jade" is a registered trademark; as a result, a rename was needed. After some discussion among the maintainers, "Pug" was chosen as the new name for this project. As of version 2, "pug" is the official package name.

If your package or app currently uses jade, don't worry: we have secured permissions to continue to occupy that package name, although all new versions will be released under pug.

Before the renaming, work had already begun on “Jade 2.0.0”. Therefore, the rename to Pug coincided with the major version bump. As a result, upgrading from Jade to Pug will be the same process as upgrading any other package with a major version bump.

The syntax of Pug has several differences, deprecations, and removals compared to its predecessor. These differences are documented in #2305.

The website and documentation for Pug are still being updated. But if you are new to Pug, you should get started with the new syntax and install the Pug package from npm.

Installation

Package

To use Pug in your own JavaScript projects:

$ npm install pug

Command Line

After installing the latest version of Node.js, install with:

$ npm install pug-cli -g

and run with

$ pug --help

Syntax

Pug is a clean, whitespace sensitive syntax for writing HTML. Here is a simple example:

doctype html
html(lang="en")
  head
    title= pageTitle
    script(type='text/javascript').
      if (foo) bar(1 + 5)
  body
    h1 Pug - node template engine
    #container.col
      if youAreUsingPug
        p You are amazing
      else
        p Get on it!
      p.
        Pug is a terse and simple templating language with a
        strong focus on performance and powerful features.

Pug transforms the above to:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Pug</title>
    <script type="text/javascript">
      if (foo) bar(1 + 5)
    </script>
  </head>
  <body>
    <h1>Pug - node template engine</h1>
    <div id="container" class="col">
      <p>You are amazing</p>
      <p>Pug is a terse and simple templating language with a strong focus on performance and powerful features.</p>
    </div>
  </body>
</html>

API

For full API, see pugjs.org/api/reference.html

var pug = require('pug');

// compile
var fn = pug.compile('string of pug', options);
var html = fn(locals);

// render
var html = pug.render('string of pug', merge(options, locals));

// renderFile
var html = pug.renderFile('filename.pug', merge(options, locals));

Options

  • filename Used in exceptions, and required when using includes
  • compileDebug When false no debug instrumentation is compiled
  • pretty Add pretty-indentation whitespace to output (false by default)

Browser Support

The latest version of pug can be downloaded for the browser in standalone form. It only supports the very latest browsers, though, and is a large file. It is recommended that you pre-compile your pug templates to JavaScript.

To compile a template for use on the client using the command line, do:

$ pug --client --no-debug filename.pug

which will produce filename.js containing the compiled template.

Tutorials

Implementations in other languages

Ports in other languages

Ports to other languages, with very close syntax:

Equivalents in other languages

Templates engines for other languages with a different syntax, but a similar philosophy:

Framework implementations/adapters

Embedded view engines for frameworks:

CMS plugins

Additional Resources

Backers

Support us with a monthly donation and help us continue our activities. [Become a backer]

Sponsors

Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]

License

MIT

Comments
  • Pug Logo

    Pug Logo

    Unfortunately, as per #2184 we need a new logo. The original discussion around the logo was in #1882.

    @GarthDB and @viktorbezdek have both volunteered to help with the designs.

    opened by ForbesLindesay 183
  • Bypass `with` using the module system

    Bypass `with` using the module system

    We can dramatically improve performance if we don't use with.

    We achieve a similar effect to with using the global object from a separate module.

    This improves performance by a factor of 3.

    opened by chowey 74
  • Jade's official icon?

    Jade's official icon?

    Hi, i'm a fan of jade

    I'm in progress with my sublime-text theme project: sliver.

    I'm a about to write down the sidebar icons, and I've noticed that there is no official jade icon...

    I know is not a big issue, but I was wondering if it was planned...

    Thanks in advance!

    opened by cloud-walker 57
  • Deprecate implicit text-only for script and style

    Deprecate implicit text-only for script and style

    closes #875

    If we can remove this feature (probably in 0.32.0) then it will simplify a lot of code and significantly reduce the amount you have to learn when you're new to node.

    The first step to removing it is to deprecate it and discourage people from using it, so this pull request logs a warning whenever someone relies on this feature. Dealing with the fallout from this will also help to gauge how many people we're going to annoy by removing this feature.

    Crucially, once we actually remove the feature altogether, we will be able to write templates that do things like:

    script
      import foo.js
    

    which would be enormously useful.

    opened by ForbesLindesay 50
  • Allow multiple blocks to be defined inside mixins and includes

    Allow multiple blocks to be defined inside mixins and includes

    I would like to be able to write my markup like thus:

    //panel.jade
    
    section.panel
      block head
        header
          h1.title!= title
      .content
        yield
    

    invocation:

    //some_file.jade
        include panels/panel
          block head
            //nothing
          img( src="#{work.urls.main}/poster_280.jpg" )
    

    Update based on feedback the new proposal would be:

    //panel.jade
    mixin panel
      section.panel
        block head
          header
            h1.title Default
        .content
          yield
    

    invocation:

    //some_file.jade
        + panels/panel
          disable head
          img( src="#{work.urls.main}/poster_280.jpg" )
    
    mixin pug-linker 
    opened by jasonkuhrt 49
  • Feature Request: Nesting Syntax

    Feature Request: Nesting Syntax

    So instead of having to do:

       div
          | some text
          code some code
          | and some text
    

    maybe we could do:

       div some text [ code some code ] and some text
    

    so it would treat everything inside the [ ] as it's own line then continue with the text node

    not sure if this is a silly idea, thought id throw it out there

    interpolation 
    opened by jpillora 36
  • Overhaul `filters`

    Overhaul `filters`

    I think there are a number of things that could be done to improve filters enormously. I'm mostly using Jade for static site generation, so filters are one of the most important features for me as they allow me to do things like write the actual posts in markdown.

    Use transformers

    transformers is like consolidate.js except that it supports synchronous rendering where possible (it almost always is) and it has a few things that are not really tempting languages (markdown, coffee-script, cdata and uglify-js).

    Over time, separating filters out into a separate library like this would allow the collection of possible filters to explode as a result of being able to share their implementation with many other libraries.

    Each transformer also has an .outputFormat (xml, css or js) which can be used to work out what kind of script/style tags to wrap the result in.

    Filtered includes

    I would like to support filtering an included file:

    :markdown include path/to/markdown.md
    

    Filtering Filters

    This needs to be clever enough not to keep wrapping the result in an additional <script> or <style> tag each time (it should only do that for the last filter):

    :uglify:coffee
      my coffee script
    

    Runtime filters

    I would like to have filters sometimes be compile time and sometimes be run-time. They'd be compile time where possible, and only fall back to run-time when necessary.

    This would allow the following significant use cases:

    The following escapes foo then transforms it using filter before buffering it (all at runtime):

    :filter= foo
    

    The following transforms foo using filter before buffering it (all at runtime):

    :filter!= foo
    

    The following passes {user: user} to the filter EJS and runs it at run time.

    :ejs(user=user)
      <%- user.id %>
    

    The following passes {compress: true} to the filter less and runs it at compile time

    :less(compress=true)
      .less-styles {
        background:blue;
      }
    

    At compile time

    :uglify(mangle=false):coffee(bare=true)
      some coffee script
    
    pug-filters mixin 
    opened by ForbesLindesay 34
  • Allow multiline JS var definition

    Allow multiline JS var definition

    Similar to how this works in Jade:

    input(
      type='checkbox'
      name='agreement'
      checked)
    

    I'd like to be able to do this:

    config = {
      a: 'something',
      b: 'something-else'
    }
    

    instead of having to write:

    config = { a: 'something', b: 'something-else' }
    

    This is a short example, however as config grows it would be much prettier if funky spacing was allowed.

    opened by kinergy 33
  • Populating attributes from objects (extracting keys/values)

    Populating attributes from objects (extracting keys/values)

    I'm wondering if there is any way to populate the attributes on an element from the keys/values on an object. What I really want to do is something like this:

    input.foo(name=name, value=value, attributes)
    

    Pass in data like this:

    {
        name: 'username',
        value: 'bob',
        attributes: {
            maxlength: 16
        }
    }
    

    and get this output:

    <input name="username" value="bob" maxlength="16" />
    

    Is there any way to accomplish this without needing to specify each attribute individually?

    opened by Prestaul 32
  • Renaming jade -> pug

    Renaming jade -> pug

    Unfortunately, these people have a trademark for the word "jade" referring to software, so we've been forced to change our name. Fortunately, @davidglivar has kindly donated the name "pug" to us. I've claimed pug and pugjs everywhere I could think of so hopefully we shouldn't have any problems getting the name.

    Action items

    • [x] create a new logo (@GarthDB)
    • [x] design new branding for the website (@GarthDB)
    • [x] develop new website
    • [x] rename all repositories
    • [x] update every reference to "jade" to refer to "pug" in all repositories
    • [x] add @TimothyGu as an owner of all "pug" related npm repos
    • [x] publish working alpha-release
    • [ ] test and stabalise release
    • [ ] release pug 2.0.0

    Versioning & Deprecation

    There will be no 2.0.0 release of jade, instead it will be released as pug 2.0.0. In the mean time, pug 0.10.x will be used for experimental releases of pug 2.0.0 until it is stabilised.

    Existing versions of jade will be left working for at least 6 months. There may be a [email protected] release aimed at being as compatible as possible with [email protected].

    The new website will be at www.pugjs.org (which I have registered). Once that website is built, http://jade-lang.com/ will be updated to redirect to www.pugjs.org

    FAQ

    Why pug?

    It's short, memorable and widely available. Not only that, but pugs are cute!

    Do we really have to change the name?

    Yes. The stress of pursuing this through the courts would be too high. I would much rather focus my efforts on writing great software, and supporting the people who use pug.

    Couldn't we just change the name to ?

    Maybe, but I like pug, and it's definitely available. If your suggestion was along the theme of "make a one letter change to jade", I think it's preferable in the long run to make a clean break and start with a nice fresh brand.

    more questions (and answers) will be added as they are asked

    opened by ForbesLindesay 31
  • Feature Request: Multiline Code Blocks

    Feature Request: Multiline Code Blocks

    Much like the new multi-line attributes, I think it would be very nice to have the ability for multi-line code blocks. I hate going beyond 80 chars per line and sometimes with partial rendering or a condition, things get a little long.

    != someAwesomeHelper('param1', 'param2'
                         'params3', 'param4')
    
    opened by malkomalko 30
  • Pug-Walker: No way to access parent node.

    Pug-Walker: No way to access parent node.

    Pug Version: Latest Node Version: LTS 16.13.1 at the time

    Description

    I'm trying to use pug walker to create our own internal linting utilities, but the walker doesn't provide a way to get access to the node parent element like babel or eslint.

    opened by Ibrahimrahhal 0
  • pug won't install using node v12 due to broken dependency.

    pug won't install using node v12 due to broken dependency.

    Pug Version: your version number here @latest Node Version: your version number here 12.22.12

    Input JavaScript Values

    N/A

    Input Pug

    N/A

    Expected HTML

    N/A

    Actual HTML

    N/A

    Additional Comments

    Pug installation is failing on npm or yarn with node v12 due to

    error An unexpected error occurred: "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz: incorrect data check".
    
    opened by geoidesic 1
  • Pug accessed controller variable without passing it

    Pug accessed controller variable without passing it

    Pug Version: 3.0.2

    Node Version: 18.12.0

    I have project using Express with pug then I found a strange behavior on my view. They somehow access some variable I didn't declare/pass. After a bit digging I found out that pug somehow be able to access controller variable that haven't declare with a var/let/const keyword. I'm not sure is it a bug or a feature.

    Input JavaScript Values

    module.exports = {
        renderLogin: (req, res) => {
            test_variable = "This variable has been passed"
            res.status(200).render('login', {
                message: req.query.message,
                icon: req.query.icon,
                alert_type: req.query.alert_type,
            });
        }
    }
    

    Input Pug

    .container-fluid.vw-100.vh-100.bg-light
       h1=test_variable
       // - other form stuffs
      
    

    Render view

    image

    opened by dinhitcom 0
  • Express and i18n

    Express and i18n

    Better support for i18n is needed inside pug templates. For now I found the solution but it's a bit complex and confusing. I though pug processor is one of the natively supported engines for i18n.

    Pug Version: "^3.0.2", Node Version: v14.15.4

    Input JavaScript Values

    // server level app.use(function(req, res, next) { // express helper for natively supported engines i18n.init(req, res); res.locals.__ = res.__ = function() { return i18n.__.apply(req, arguments); }; next(); });

    // Module level const pug = require('pug'); const func = pug.compileFile('pug/test.pug'); function foo(req, res) { let msg = res.__('Hello'); let ins = func({ message: msg, : res. }); // << I have to add this to every render request res.end(ins); }

    Input Pug

    p #{msg} p #{__('Hello')}

    Expected HTML

    Localised output (based on browser locale)

    Actual HTML

    Localised output (based on browser locale)

    I finally made it work, but there should be an easier way to do it.

    opened by michaelpastushkov 0
  • Official project status update

    Official project status update

    I'd like to say thanks for all the time and effort you've put in over the years. I've used jade/pug across many projects and companies and have a lot of love for it. With that being said, it doesn't seem like pug is maintained at this point. It's completely understandable if you're busy or have simply moved on to greener pastures. Whatever the reason may be, is it possible to get an official status update on pug @ForbesLindesay?

    On a side note, would donations to pug's Open Collective page make any difference, or is pug considered pretty much done/inactive at this point? I'm assuming there is no v4 in the works but was hoping to get some kind of confirmation in terms of pug's future or perhaps a notice added to the readme / npm package.

    Thanks (and much ❤️ for 🐶)!

    opened by mmarti 0
  • [email protected](Feb 28, 2021)

  • [email protected](Feb 28, 2021)

    Bug Fixes

    • Sanitise the pretty option (#3314)

      If a malicious attacker could control the pretty option, it was possible for them to achieve remote code execution on the server rendering the template. All pug users should upgrade as soon as possible, see #3312 for more details.

    Source code(tar.gz)
    Source code(zip)
  • [email protected](Feb 28, 2021)

  • [email protected](Feb 28, 2021)

    Bug Fixes

    • Variables starting with keywords cause the regex to "drift" on capture groups, causing errors (#3274)

    • Lexer plugins are not dropped inside tag interpolation (#3296)

      You can use tag interpolation to embed tags in long strings, e.g.

      p.
        This is a #[strong long] string of text.
      

      Previously, lexer plugins would not work within the #[...] interpolation.

    • Handle escaped unsafe interpolation correctly (#3299)

      If you want to put the literal text #{ in your html, it needs to be escaped to indicate that it should not be treated as interpolation. The same is true of !{ You can escape them by prefixing them with \, e.g.

      p These are some \#{ weird \!{ symbols
      

      Previously this would have incorrectly converted both escaped sequences to #{, resulting in the html:

      <p>These are some #{ weird #{ symbols</p>
      

      Now this correctly generates:

      <p>These are some #{ weird !{ symbols</p>
      
    Source code(tar.gz)
    Source code(zip)
  • [email protected](Feb 28, 2021)

    Bug Fixes

    • Sanitise the pretty option (#3314)

      If a malicious attacker could control the pretty option, it was possible for them to achieve remote code execution on the server rendering the template. All pug users should upgrade as soon as possible, see #3312 for more details.

    Source code(tar.gz)
    Source code(zip)
  • [email protected](May 25, 2020)

    Breaking Changes

    • read plugins must now return Buffer if you want to support filters that use renderBuffer (#3213)

      If you don't wish to support this advanced use case, you can continue returning string. If you did not provide a read plugin, you do not need to do anything.

    • The minify option on filters now requires you to install the relevant jstransformer (#3084)

      Currently we support:

      • jstransformer-uglify-js for JavaScript
      • jstransformer-clean-css for CSS
    • Drop support for node 6 and 8 (#3243)

    New Features

    • Support filters that apply to Buffers (#3213)

      e.g.

      // options.js
      exports.filters = {
        png: {
          // instead of a function, specify an object with a "renderBuffer" property
          // whose value is a function that takes a Buffer instead of a string
          renderBuffer: function(buffer, options) {
            var data = Buffer.from(buffer).toString('base64');
            return '<img src="data:image/png;base64, ' + data + '"/>';
          }
        }
      };
      

      You can then use the filter like:

      // foo.pug
      include:png my-small-image.png
      
    • Add support for replacing code gen via a plugin with generateCode (#3230)

    • Support each ... of ... loops (#3179)

      each value of iterable
        li= value
      

      This requires an environment that supports the for (const val of iterable) syntax in JS. You can iterate over Maps, Sets etc. as well as arrays. There is also some destructuring of map keys:

      - const map = new Map([['a', 'x'], ['b', 'y']]);
      each [key, value] of map
        li
          strong= key
          = value
      
    Source code(tar.gz)
    Source code(zip)
  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

    Breaking Changes

    • read plugins must now return Buffer if you want to support filters that use renderBuffer (#3213)

    • Drop support for node 6 and 8 (#3243)

    New Features

    • File nodes now get a raw property that is a Buffer, in addition to the str (#3213)
    Source code(tar.gz)
    Source code(zip)
  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

    Breaking Changes

    • Drop support for node 6 and 8 (#3243)

    • Support each ... of ... (#3179)

      The pug lexer can now output a new token type: eachOf

    Source code(tar.gz)
    Source code(zip)
  • [email protected](May 25, 2020)

    Breaking Changes

    • The minify option on filters now requires you to install the relevant jstransformer (#3084)

      Currently we support:

      • jstransformer-uglify-js for JavaScript
      • jstransformer-clean-css for CSS
    • Drop support for node 6 and 8 (#3243)

    New Features

    • Support filters that expect a Buffer instead of a string (#3213)

      e.g.

      // options.js
      exports.filters = {
        png: {
          // instead of a function, specify an object with a "renderBuffer" property
          // whose value is a function that takes a Buffer instead of a string
          renderBuffer: function(buffer, options) {
            var data = Buffer.from(buffer).toString('base64');
            return '`img src="data:image/png;base64, ' + data + '"/>';
          }
        }
      };
      

      You can then use the filter like:

      // foo.pug
      include:png my-small-image.png
      
    Source code(tar.gz)
    Source code(zip)
  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

  • [email protected](May 25, 2020)

  • [email protected](Nov 4, 2019)

    • fix: improve error message when requiring a filter that's not installed
    • fix: toJSON is now only called on object-like values
    • fix: preLex plugins were not called when compiling from a string
    • perf: add "files" property to exclude un-used files from package and reduce install size
    • feat: support ... spread attributes when compiling to JSX N.B. this will not work when rendering to HTML
    Source code(tar.gz)
    Source code(zip)
  • [email protected](Nov 4, 2019)

    • fix: update clean-css dependency. This resolves a RegExp DoS vulnerability that should not have impacted any pug users (unless you process un-trusted pug source code)
    Source code(tar.gz)
    Source code(zip)
eXtensible Template Engine lib for node and the browser

xtemplate High Speed, eXtensible Template Engine lib on browser and nodejs. support async control, inheritance, include, logic expression, custom func

xtemplate 553 Nov 21, 2022
Embedded JS template engine for Node, Deno, and the browser. Lighweight, fast, and pluggable. Written in TypeScript

eta (η) Documentation - Chat - RunKit Demo - Playground Summary Eta is a lightweight and blazing fast embedded JS templating engine that works inside

Eta 682 Dec 29, 2022
Variation-template - Variation is a PSD template that is covered into a web template using HTML5, CSS3, Bootstrapv4.6, JavaScript.

Variation Template Design Variation is a PSD website template. In this project this template is designed with HTML. Deployment This site is deployed a

Bipronath Saha 1 Jan 1, 2022
The fastest + concise javascript template engine for nodejs and browsers. Partials, custom delimiters and more.

doT Created in search of the fastest and concise JavaScript templating function with emphasis on performance under V8 and nodejs. It shows great perfo

Laura Doktorova 4.9k Dec 31, 2022
Take a swig of the best template engine for JavaScript.

NOT MAINTAINED Fork and use at your own risk. Swig Swig is an awesome, Django/Jinja-like template engine for node.js. Features Available for node.js a

Paul Armstrong 3.1k Jan 4, 2023
1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.

JavaScript Templates Contents Demo Description Usage Client-side Server-side Requirements API tmpl() function Templates cache Output encoding Local he

Sebastian Tschan 1.7k Jan 3, 2023
A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)

Nunjucks Nunjucks is a full featured templating engine for javascript. It is heavily inspired by jinja2. View the docs here. Installation npm install

Mozilla 8k Dec 30, 2022
Highly opinionated project template for Serverless Framework that follows and applies hexagonal architecture principle to serverless world. Prepared with easy testing in mind.

serverless-hexagonal-template Highly opinionated project template for Serverless Framework that applies hexagonal architecture principles to the serve

Paweł Zubkiewicz 126 Dec 26, 2022
Script Template Fivem in Type Script

fivem-ts ?? A Typescript Template for FiveM ?? This is a basic template for creating a FiveM resource using Typescript. It includes webpack config fil

Vinícius Pereira 3 Jun 11, 2021
A K6 Multi Scenario template applying some best practices along some examples

K6-Multi-Scenario-Template It is a performance testing template that shows how to use K6 to implement a Multi Scenario template applying some best pra

Swiss Life OSS 33 Nov 27, 2022
Tailwind & Next Mentorship Template

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Nauval 21 May 22, 2022
Examples of how to re-create the WordPress Template Hierarchy using headless clients and WPGraphQL

WPGraphQL Template Hierarchy Debugger This is a project to demonstrate how to re-create the WordPress template hierarchy with Headless WordPress using

Jason Bahl 17 Oct 29, 2022
Template to create reactjs component library which will help you to create your dream library.

reactjs-library-template Template to create reactjs component library which will help you to create your dream library. How to use Commands to setup e

Nishant Tomar 1 Dec 25, 2021
A template to be used for creating js/scss projects and deploy them to github pages

A template to be used for creating js/scss projects and deploy them to github pages

Cariera în IT 15 Oct 30, 2022
Low tech template for a reduced carbon impact :seedling:

Enverse minimalist front-end template ?? ?? For all else, use Astro.build ?? Recomended package manager: pnpm Preact + Typescript + Vite How to use: F

null 2 Jan 10, 2022
Obsidian To HTML, A template for building obsidian style notes to a static site

oth (Obsidian To HTML) This is a template for publishing obsidian notes as a static site. The goal of the project is to stay minimal, since this is a

Ulisse mini 11 Nov 4, 2022
My discord.js bot template

My discord.js Bot Template This repository is an ongoing project to extract core pieces of the discord.js bots and ecosystems I run into a reusable te

Ian Mitchell 8 Mar 3, 2022
An example project using Node.js to run some common tasks including directory backup

All code from this tutorial as a complete package is available in this repository. If you find this tutorial helpful, please share it with your friend

Alex 11 Sep 28, 2022
This is a simple ticket system bot using discord.js v13 and node.js v17. It works with buttons and slashcommands.

Ticket-bot This is an simple ticket system bot using discord.js v13. If you find an error or need support, go to my discord server and open a ticket >

Cristhian 14 Jan 2, 2023