
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
Add comics to your website or app with an API. Choose a character, angle, emotion and pose. Embed on your page.
We love comics. We badly wanted to create comic strips. But there was one problem. Some of us can't draw a straight line for nuts.
But why should that stop us from creating comics? So here's a gift to ourselves and the world — a Comic Creator.
We created Comicgen to help people write better stories using comic.
Interested in data storytelling? Come join the #ComicgenFriday community.
A simple way to use Comicgen is from gramener.com/comicgen/.
Here's a 3-minute video explaining how to create your own comic strip.
To run your own server, run:
npm install -g comicgen # Install Comicgen globally
comicserver # Run server at http://localhost:3000/
To include Comicgen in your own Node.js app, run:
npm install comicgen
Then you can insert it in your app:
const comicgen = require("comicgen");
// Returns the SVG string for the character
const svg = comicgen({ name: "ava", emotion: "cry", pose: "angry" });
To run your own server, run:
docker run -p3000:3000 -it gramener/comicgen
# This runs the server at http://localhost:3000/
For lettering, you can use comic fonts from Google fonts or Fonts.com.
Some fonts we like are:
| Font | Example text |
|---|---|
| Architects Daughter | ![]() |
| Cavolini (Windows) | ![]() |
| Segoe Script (Windows) | ![]() |
| Segoe Print (Windows) | ![]() |
| News Cycle | ![]() |
| Indie Flower | ![]() |
| Amatic SC | ![]() |
| Schoolbell | ![]() |
| Just Another Hand | ![]() |
| Patrick Hand | ![]() |
| Neucha | ![]() |
| Handlee | ![]() |
You can also use Comicgen using the plugins below. (We're planning more plugins. Your help is welcome!)
The Comicgen Power BI plugin lets you control the characters, emotions, poses, etc from data. Happy people can accompany good news on charts.

Comics are rendered via the endpoint https://gramener.com/comicgen/v1/comic (or wherever you installed it).
We'll refer to this as /comic from now on.
Options for each character can be specified as URL query parameters. For example, to render Ethan's angling sideways, winking, we need:
name: ethanangle: sideemotion: winkpose: normalThis is exposed at /comic?name=ethan&angle=side&emotion=wink&pose=normal:
The full list of options is at dist/characterlist.json.
You can create comics by directly linking to these files. You can embed these files directly in your plugin.
To include comic as HTML components, add this to your page:
<script src="https://cdn.jsdelivr.net/npm/uifactory@1.18.0/dist/uifactory.min.js" import="@comic-gen"></script>
Then you can add a <comic-gen> tag with the options for each character as attributes, like this:
<comic-gen name="ethan" angle="side" emotion="wink" pose="normal" ext="svg"></comic-gen>
To render as a PNG, change ext="svg" to ext="png".
If you change attributes using JavaScript, the comic is re-rendered.
NOTE: Currently, <comic-gen> cannot be used inside an SVG element.
Storytellers want to share a message and change their audience. But they worry that their content is not engaging or "catchy" enough to drive the change.
Anyone who writes an email, a presentation, or a document, is a storyteller.
Developers want to build engaging apps. But design skills are not their forte. Stock images can't match the variety of their scenarios.
Organizations typically use Comicgen for:
Our vision is to make storytelling with comics easy for everyone. (This includes non-designers, non-programmers, and non-storytellers.)
We do this by:
We succeed when more people create more and better stories with Comicgen. We measure this by
Install the dependencies to run Comicgen:
git clone https://github.com/gramener/comicgen
cd comicgen # Go to the Comicgen folder
npm install # Install dependencies
npm run build # Compile Comicgen
npm start # Run Comicgen server on port 3000
To add a new character, or add images for an existing character:
svg/<character>/<attr>/.../<file>.svgsvg/<character>/index.json and svg/<character>/index.svg. See svg/dee/ for referencenpm run build to recompile files under dist/New versions of comicgen are released on Github and npm. Here is the release process:
# Update package.json version.
npm install
npm upgrade
npm run build
npm run lint
export VERSION=1.x.x
git commit . -m"DOC: Release version $VERSION"
git push origin v1
git push gitlab v1
# Then: Test build at https://code.gramener.com/s.anand/deedey/-/pipelines
# Then: Test output at https://gramener.com/comicgen/v1/
# Merge into release branch
git checkout release
git merge v1
git tag -a v$VERSION -m"Release version $VERSION"
git push gitlab release --follow-tags
git push origin release --follow-tags
git checkout v1
Then release on npm and Docker:
# npm repo owned by @sanand0
npm publish
docker build --tag gramener/comicgen:latest --tag gramener/comicgen:$VERSION pkg/docker/
docker push gramener/comicgen:latest
docker push gramener/comicgen:$VERSION
If you're a developer, we'd love your help in improving comicgen.
There are 3 areas we're focusing on. Help in these areas would be ideal.
People like to use their own platforms, not switch to a new one. So let's integrate comicgen into popular platforms like Excel, PowerPoint, Power BI, Tableau, R, etc as plugins.
See integration issues related »
People find it easier to create comics using a UI than programming. So let's create an interface that let people create an entire graphic novel!
Developers access comicgen through a JS library. What can we do to make it easier, and feature rich?
Library developed by
Conceived & designed by
Designers, we'd love your help in improving comicgen.
If you're a designer, you could help by:
Here's a guide to help understand how to design and submit new characters or layers.
Characters are made of 1 or more SVG images.
The easiest way to create a character is to draw a dozen SVGs and save them as individual files of the same dimensions. For example:

A better way would be to break up the character into different parts. For
example, you could draw faces with different emotions and save them under an
faces/ folder:

Then you could draw the bodies under a bodies/ folder:

If you do this, you must make sure that:
You can choose to break up the images in any number of ways. For example:
faces/, bodies/face/, trunk/, leg/, shoes/hair/, face/, eyes/, mouth/, trunk/, legs/The more combinations you have, the more complex your image becomes. You could start small and then add variety.
While designing a character in Comicgen, keep these inmind:
lookingdown.svg is OK. LookingDown.svg, looking-down.svg or looking down.svg are notUse the below template as the base for creating your character
Go to File > Export as > Format: SVGs - Use artboards > Save (follow below settings while saving)
{.img-fluid}
afraidangryannoyedblushconfusedcrycryingloudlycunningcuriousdisappointeddozingdrunkexcitedfacepalmhappyhearteyesirritatedlookingdownlookingleftlookingrightlookingupmaskneutralnevermindoohroflrollingeyessadscaredshockedshoutsmilesmirkstarstrucksurprisedthinkingtiredtongueoutwhistlewinkworried| pose | standing | side | sitting | standing back | sitting back |
|---|---|---|---|---|---|
| explaining | Yes | Yes | Yes | Yes | Yes |
| handsonhip | Yes | Yes | Yes | ||
| normal | Yes | Yes | Yes | Yes | Yes |
| pointingdown | Yes | Yes | Yes | ||
| pointingleft | Yes | Yes | Yes | Yes | Yes |
| pointingright | Yes | Yes | Yes | Yes | Yes |
| pointingup | Yes | Yes | Yes | Yes | Yes |
| shrug | Yes | Yes | Yes | Yes | Yes |
| thumbsup | Yes | Yes | Yes | Yes | Yes |
| explaining45degreesdown | Yes | Yes | Yes | ||
| explaining45degreesup | Yes | Yes | Yes | Yes | Yes |
| explainingwithbothhands | Yes | Yes | Yes | Yes | Yes |
| handsclasped | Yes | Yes | Yes | ||
| handsfolded | Yes | Yes | |||
| handsheldback | Yes | Yes | Yes | ||
| handsinpocket | Yes | Yes | Yes | ||
| handstouchingchin | Yes | Yes | Yes | ||
| hi | Yes | Yes | Yes | Yes | Yes |
| holdingboard | Yes | Yes | Yes | ||
| holdingbook | Yes | Yes | Yes | ||
| holdingcoffee | Yes | Yes | Yes | ||
| holdinglaptopfrontangle | Yes | Yes | Yes | Yes | Yes |
| holdinglaptopsideangle | Yes | Yes | Yes | Yes | Yes |
| holdingmobile | Yes | Yes | Yes | Yes | Yes |
| holdingpaper | Yes | Yes | Yes | Yes | Yes |
| holdingstick | Yes | Yes | Yes | Yes | Yes |
| leaningagainst | Yes | Yes | |||
| lookingdownatlaptop | Yes | Yes | Yes | Yes | Yes |
| pushing | Yes | Yes | |||
| scratchinghead | Yes | Yes | Yes | Yes | Yes |
| super | Yes | Yes | Yes | Yes | Yes |
| takingnotes | Yes | Yes | Yes | ||
| talkingoverphone | Yes | Yes | Yes | Yes | Yes |
| thinking | Yes | Yes | Yes | ||
| workinganddrinkingcoffee | Yes | Yes | Yes | ||
| writingonboard | Yes | Yes | Yes | ||
| yes | Yes | Yes | Yes | Yes | Yes |
| yuhoo | Yes | Yes | Yes | Yes | Yes |
Give your character a name (e.g. "Ant Man"). Save the SVG files under a folder with the character name (e.g. "ant-man" - lower-case, use hyphens as separator). Add this folder under the svg/ folder.
Then send a pull request or email S Anand s.anand@gramener.com.
When doing this, please mention one of the following:
Comicgen is free, but their designers' time is not. We pay the designers in our team, and freelancers, for the characters they design.
Please e-mail Anand s.anand@gramener.com and Richie richie.lionell@gramener.com if you can design characters as a freelancer. We'd love your help.
Gramener visuals do not externally collect any information, personal or otherwise. If you have any questions, please contact us at comicgen.powerbi@gramener.com
FAQs
Add comics to your website or app with an API. Choose a character, angle, emotion and pose. Embed on your page.
The npm package comicgen receives a total of 291 weekly downloads. As such, comicgen popularity was classified as not popular.
We found that comicgen demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.