oh-my-logo: gradient ASCII art for a terminal banner
Display giant ASCII-art logos with colorful gradients in your terminal — like Claude Code or Gemini CLI.
At a glance
- What is it?
- oh-my-logo takes a string and prints it as ASCII art with a colour gradient, in either an outlined style or a filled block style, across thirteen built-in palettes and custom colour lists. It runs through npx with no installation, and the same package works as a library for rendering animated logos inside a program.
- Who is it for?
- Adopt oh-my-logo if you want a terminal banner with a gradient and you prefer generating the art at run time to keeping a pre-rendered file in the repository. Do not adopt it if you need the output to be plain text for a log or a file, since the colour is the point.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 157 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Two rendering modes, thirteen palettes
oh-my-logo creates ASCII art logos with gradient colours in the terminal, and it is pitched at project banners, startup logos, and making a terminal look good. The tagline is to display giant ASCII art logos with colourful gradients, like Claude Code or Gemini CLI do.
The rendering has two modes. The default is outlined ASCII art, the figlet style, where each letter is drawn as a block of characters. The alternative is filled mode, where the letters are solid block characters instead, which reads more like a logo and less like a text rendering. The two modes also take different fonts, different gradient direction defaults, and different extra options, which is why the option table lists defaults per mode rather than one global set.
Thirteen palettes ship with the tool, from sunset gradients to matrix green, and the table gives their colour values. grad-blue is the default, running from #4ea8ff to #7f88ff. sunset is warm, #ff9966 through #ff5e62 to #ffa34e. dawn is a cool morning blue, #00c6ff to #0072ff. nebula is a purple space colour, #654ea3 to #eaafc8. ocean is deep blues, #667eea to #764ba2. fire is #ff0844 to #ffb199. forest is a natural green pair, #134e5e to #71b280, and the table is cut off after that.
You can list them with the --list-palettes flag, and the --gallery flag renders the text in every available palette at once, which is the fastest way to pick one.
The project is MIT and CC0-1.0 licensed, and the licences are separated on purpose. The logos the tool produces are CC0, meaning public domain, and the README says you can use them anywhere. The package itself is MIT. The primary language is TypeScript, the home page is the npm package page for oh-my-logo, and the last push to the repository was on 2026-05-19, with release 0.5.0 on the same day.
Running it, and what zero dependencies actually means
The quick start needs no installation at all:
npx oh-my-logo "HELLO WORLD"And filled mode is a flag:
npx oh-my-logo "YOUR LOGO" sunset --filledThe feature list calls this zero dependencies, meaning you can run it instantly with npx and nothing to install. That is a claim about the user experience rather than about the package, and the package manifest is clear about the distinction. The runtime dependencies are cfonts, commander, figlet, gradient-string, ink, and react, with the package requiring Node 18 or newer.
So the actual division of labour is that figlet renders the text as ASCII art, gradient-string applies the colour gradient to the rendered lines, commander parses the command line, cfonts is the alternative font set, and ink provides the React-based rendering. That is why the tool is TypeScript rather than a small script, and why the library API returns a promise.
The three installation routes reflect the three ways people use it. Globally with npm install -g oh-my-logo, directly with npx oh-my-logo, or as a dependency with npm install oh-my-logo if you want to call it from your own code.
Custom palettes, and the two syntaxes for them
The --palette-colors option, added in version 0.4.0, is the feature that makes the tool usable for a project with its own brand colours rather than a generic sunset.
The documentation gives two syntaxes, and the reasoning about which to use is the useful part:
# JSON array (double quotes recommended)
npx oh-my-logo "MY LOGO" --palette-colors '["#00ff00","#ffa500","#ff0000"]'
# Simple comma-separated notation (wrap each color in quotes)
npx oh-my-logo "MY LOGO" --palette-colors "'#00ff00', '#ffa500', '#ff0000'"The comma-separated form is convenient for quick manual CLI usage and one-liners. The JSON array form works well when you want to store the palette in shell scripts or CI variables, pass the result of JSON.stringify from Node.js, or keep the array in configuration files. Extra whitespace is trimmed automatically, and colour strings can be hex codes or any CSS colour supported by gradient-string.
The one limitation is that the positional palette argument continues to accept built-in palette names only. Custom colours have to go through the option, so a script that wants to pass a palette positionally cannot pass a custom one. Custom palettes can be combined with other options like --reverse-gradient or --filled.
A related detail: the --color flag forces colour output, which is described as useful for pipes, and --no-color disables it. That pair exists because a library that writes ANSI colour cannot know whether its output is going to a terminal, and the default behaviour of most tools is to disable colour when the output is not a TTY, which is right for logs and wrong for a banner you deliberately piped somewhere.
Filled mode extras: block fonts, shadow styles, and letter spacing
Filled mode is where the option surface widens, and the flags in question are the ones added in version 0.3.0.
The shadow styles are selected with --block-font, and the documented values are block for box-drawing shadows, which is the default, chrome for minimal sleek shadows, and shade for dotted and shaded shadows.
# Box-drawing shadows (default)
npx oh-my-logo "STYLE" fire --filled --block-font block
# Minimal sleek shadows
px oh-my-logo "STYLE" fire --filled --block-font chrome
# Dotted/shaded shadows
npx oh-my-logo "STYLE" fire --filled --block-font shadeThe full block-font list from the options table is 3d, block, chrome, grid, huge, pallet, shade, simple, simple3d, simpleBlock, slick, and tiny.
Letter spacing is the other one, and it is specific to filled mode, where the character spacing changes the visual density of the logo. The default is 1, and the flag takes an integer number of spaces between characters:
# Wide spacing (5 spaces between letters)
npx oh-my-logo "WIDE" ocean --filled --letter-spacing 5
# Tight spacing (no spaces)
npx oh-my-logo "TIGHT" ocean --filled --letter-spacing 0And --reverse-gradient flips the palette order, which works in both modes.
The design of these options follows from the fact that filled mode is not just a different font. The filled letters are drawn with block characters, which means the shadow is drawn with a different character set, which means the shadow is itself a font choice. That is why the shadow style is a separate flag from the font, and why letter spacing only applies to filled mode.
The library API, and what the examples directory shows
The same package is a library, and the API is the interesting part for anyone who wants to render a logo inside a program rather than in a shell.
import { render, renderFilled, PALETTES, getPaletteNames } from 'oh-my-logo';
// Basic ASCII art rendering
const logo = await render('HELLO WORLD', {
palette: 'sunset',
direction: 'horizontal'
});
console.log(logo);The exported functions are render for the outlined style and renderFilled for the block style, with PALETTES and getPaletteNames for inspecting the built-in colour sets. The options object takes a palette, which can be a name or an array of colour strings, a font, and a direction of vertical, horizontal, or diagonal.
// Filled with custom shadow style
await renderFilled('SHADOW', {
palette: 'sunset',
font: 'shade' // Use dotted shadow effect
});The TypeScript usage is the same call with a typed options object, using the RenderOptions and PaletteName types:
import { render, RenderOptions, PaletteName } from 'oh-my-logo';
const options: RenderOptions = {
palette: 'ocean' as PaletteName,
direction: 'vertical',
font: 'Standard'
};
const typedLogo = await render('TYPESCRIPT', options);The package manifest shows the shape of the distribution. The main entry point is ./dist/lib.js with types at ./dist/lib.d.ts, and there is a separate ./cli export at ./dist/index.js with its own types, so a library consumer never pulls in the command line entry point. The build is plain tsc over the tsconfig.json, the tests are Vitest with a UI and a coverage mode, and the formatting is Biome rather than Prettier.
The examples/ directory holds basic.ts, advanced.ts, filled.ts, rainbow.ts, and error-handling.ts, and the presence of an error-handling example is a good sign, because the interesting failure mode in a renderer is a text input it cannot map to glyphs.
Editorial conclusion
Adopt oh-my-logo if you want a terminal banner with a gradient and you prefer generating the art at run time to keeping a pre-rendered file in the repository. Do not adopt it if you need the output to be plain text for a log or a file, since the colour is the point. Verify first that your build environment supports ANSI colour, because the tool has to detect or be told to use it, and there are flags for forcing it either way.
Frequently asked questions
How do I run oh-my-logo without installing it?
Use npx. Running npx oh-my-logo "HELLO WORLD" prints the logo straight away, and adding the --filled flag switches to filled block characters. The package also installs globally with npm install -g oh-my-logo, or as a dependency if you want to call it from your own code.
How do I use my own colours in oh-my-logo?
With the --palette-colors option, which accepts a JSON array of colours or a comma-separated list of quoted colours. The JSON form is the one to use in shell scripts, CI variables, or configuration files, and the positional palette argument only accepts built-in palette names.
What block fonts and shadow styles are available in filled mode?
The block font list is 3d, block, chrome, grid, huge, pallet, shade, simple, simple3d, simpleBlock, slick, and tiny, and the shadow style is chosen with --block-font, where block gives box-drawing shadows by default, chrome gives minimal sleek shadows, and shade gives dotted and shaded ones.
Can I use oh-my-logo as a library?
Yes. The package exports render, renderFilled, PALETTES, and getPaletteNames, with render taking a palette, a font, and a direction. It ships TypeScript types, and the package has a separate ./cli export so a library consumer does not pull in the command line entry point.
What licence is oh-my-logo released under?
The package is MIT AND CC0-1.0, and the split is deliberate: the logos the tool produces are CC0, meaning public domain, so you can use them anywhere, while the package code itself is MIT. The current version is 0.5.0 and it requires Node 18 or newer.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/shinshin86-oh-my-logo)Was this useful?