Skip to main content

Create code images from CLI using carbon

Project description

Pybites Carbon

A small utility to generate beautiful code images using the awesome carbon service.

Install Package

Install as a Standalone Tool using uv tool (Recommended)

The uv package manager is a "fast Python package and project manager."

You can add the package to uv tools.

When using playwright, you must also download the browser binary. This package specifically uses the chromium browser.

# Add package to your tools
uv tool add pybites-carbon

# Install playwright
uv tool run playwright install chromium
# Another way to install playwright. 'uvx' is a alias for 'uv tool run'
uvx playwright install chromium

# To use pybites-carbon as a tool, run it with the command below using the '--from' option
# because it clashes with another PyPI package called 'carbon'
uv tool run --from pybites-carbon carbon

# Run using the 'uvx' alias
uvx --from pybites-carbon carbon

Install as a Project Dependency using uv Package Manager

If you already have a virtual environment and pyproject.toml file set up, ignore the first two steps.

# Create a new virtual environment
uv venv

# Create a new project
uv init

# Install package as project dependency
uv add pybites-carbon
# Install playwright browser
uv run playwright install chromium

Install with pip

Install from PyPI using pip.

# Create a new virtual environment
python -m venv .venv

# Activate virtual environment
# On macOS/Linux:
source .venv/bin/activate

# On Windows:
.venv\Scripts\activate

# Install packages
pip install pybites-carbon
playwright install chromium

Usage

You can load in code from a file, the clipboard or a snippet. You can change the language, the image background and theme. You can also provide a different directory to store the image.

$ carbon -h
usage: carbon [-h] [-v] (-f CODE | -c | -s CODE) [-i] [-l LANGUAGE] [-b BACKGROUND] [-t THEME] [-d DESTINATION] [-w WT]
              [--driver-path DRIVER_PATH]

Create a carbon code image

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -f CODE, --file CODE  File with code (default: None)
  -c, --clipboard       Use code on clipboard (default: None)
  -s CODE, --snippet CODE
                        Code snippet (default: None)
  -l LANGUAGE, --language LANGUAGE
                        Programming language (default: python)
  -b BACKGROUND, --background BACKGROUND
                        Background color (default: #ABB8C3)
  -t THEME, --theme THEME
                        Name of the theme (default: seti)
  -d DESTINATION, --destination DESTINATION
                        Specify folder where image should be stored (defaults to current directory) (default:
                        /Users/bbelderbos/code/pybites-carbon)
  -w WT, --wt WT        Windows control theme (default: sharp)
  --driver-path DRIVER_PATH
                        Path to the executable, if it is not given it reads value from environment variable
                        (DRIVER_PATH) (default: /Users/bbelderbos/bin/chromedriver)

Examples

  1. Make a hello world snippet carbon image:

    $ carbon -s 'print("hello world")'
    

    Resulting image:

    image from string

  2. Make a code image of a file, let's pick a FastAPI app I am working on:

    $ cat $HOME/code/infinite-scroll/main.py
    from fastapi import FastAPI, Query
    from sqlmodel import select, Session
    
    from youtube.models import YouTube, YouTubeRead
    from youtube.db import engine
    
    app = FastAPI()
    
    
    @app.get("/videos/", response_model=list[YouTubeRead])
    def read_videos(offset: int = 0, limit: int = Query(default=100, lte=100)):
    	with Session(engine) as session:
    		videos = session.exec(
    			select(YouTube).offset(offset).limit(limit)
    		).all()
    		return videos
    

    Run the script with the -f option:

    carbon -f $HOME/code/infinite-scroll/main.py
    

    Resulting image:

    image from file

  3. Copying the following lines to the clipboard:

    Here is my favorite feature: make an image from code I currently have on my OS clipboard (thanks pyperclip):

    Try it out, copy this code:

    from time import sleep
    
    sleep(2)
    

    Then run the script with -c:

    $ carbon -c
    

    Resulting image:

    image from clipboard

Useful shell aliases

I added this alias to my .zshrc to make it even easier:

image from string

(Actually I created this image having this alias line on my clipboard, then I ran: carbon -c -l application/x-sh -t monokai -b #D7D7BE -d $HOME/Downloads)

Developer setup

Installation

  1. Clone or fork this repository

  2. Install packages using the following options.

    • Install using the uv package manager (recommended).

      uv sync also creates project virtual environment if it doesn't exist.

       uv sync
       uv playwright install chromium
      
    • Install using pip.

      Create a virtual environment and install packages using the requirements-dev.txt file.

       python -m venv .venv
       pip install requirements-dev.txt
       playwright install chromium
      
    • Install using the Makefile via make setup.

  3. Install Tesseract.

    Refer to their instructions on the GitHub repo or the documentation for details.

Running pybites-carbon

The resulting carbon_image.png image will be downloaded to your current directory unless you specify a different destination directory using -d (or --destination).

To run the tests, type pytest or make test (it uses pytesseract - in the dev requirements - to read the text from the generated carbon image file).

We recommend running ruff before committing code. To set this up, run this after checking out the repo:

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

Enjoy and feel free to mention me or Pybites when you post one of the created images on Twitter.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pybites_carbon-0.7.2.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

pybites_carbon-0.7.2-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file pybites_carbon-0.7.2.tar.gz.

File metadata

  • Download URL: pybites_carbon-0.7.2.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.2

File hashes

Hashes for pybites_carbon-0.7.2.tar.gz
Algorithm Hash digest
SHA256 5775e1a207687f964353f4a5804cf0c3a740a2cb3a4852ef88b9f4355ba8797b
MD5 764e850a71fa5d9e62820f7d6bc74b4c
BLAKE2b-256 79ca086bfc1a495422748c81fbe43f0a18504322fe51cae59d58e9cb1e043ff8

See more details on using hashes here.

File details

Details for the file pybites_carbon-0.7.2-py3-none-any.whl.

File metadata

File hashes

Hashes for pybites_carbon-0.7.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d4da98fb9fe6ad9ae54795f6dc6a83d206fa06391525d3166e99c087cdeeccac
MD5 9c2d625f3b760c48e2412d85abc99296
BLAKE2b-256 7bae808577f84bc75fda082ab4081976e2f5e28380d75c73369741ed8dc532e8

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page