• Stars
    star
    2,351
  • Rank 19,566 (Top 0.4 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 5 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The Charm Tool and Library 🌟

Charm

A little cloud with a pleased expression followed by the words β€˜Charm from Charm’
Latest Release GoDoc Build Status

Charm is a set of tools that makes adding a backend to your terminal-based applications fun and easy. Quickly build modern CLI applications without worrying about user accounts, data storage and encryption.

Charm powers terminal apps like Glow and Skate.

Features

  • Charm KV: an embeddable, encrypted, cloud-synced key-value store built on BadgerDB
  • Charm FS: a Go fs.FS compatible cloud-based user filesystem
  • Charm Crypt: end-to-end encryption for stored data and on-demand encryption for arbitrary data
  • Charm Accounts: invisible user account creation and authentication

There’s also the powerful Charm Client for directly accessing Charm services. Self-hosting a Charm Cloud is as simple as running charm serve.

Installation

Use a package manager:

# macOS or Linux
brew install charmbracelet/tap/charm

# Arch Linux (btw)
pacman -S charm

# Nix
nix-env -iA nixpkgs.charm

# Debian/Ubuntu
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install charm

# Fedora/RHEL
echo '[charm]
name=Charm
baseurl=https://repo.charm.sh/yum/
enabled=1
gpgcheck=1
gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
sudo yum install charm

Or download a package or binary from the releases page. All major platforms and architectures are supported, including FreeBSD and ARM.

You can also just build and install it yourself:

git clone https://github.com/charmbracelet/charm.git
cd charm
go install

Charm KV

A powerful, embeddable key-value store built on BadgerDB. Store user data, configuration, create a cache or even store large files as values.

When you use Charm KV your users automatically get cloud backup, multi-machine syncing, end-to-end encryption, and the option to self-host.

import "github.com/charmbracelet/charm/kv"

// Open a database (or create one if it doesn’t exist)
db, err := kv.OpenWithDefaults("my-cute-db")
if err != nil {
    log.Fatal(err)
}
defer db.Close()

// Fetch updates and easily define your own syncing strategy
if err := db.Sync(); err != nil {
    log.Fatal(err)
}

// Save some data
if err := db.Set([]byte("fave-food"), []byte("gherkin")); err != nil {
    log.Fatal(err)
}

// All data is binary
if err := db.Set([]byte("profile-pic"), someJPEG); err != nil {
    log.Fatal(err)
}

Charm KV can also enhance existing BadgerDB implementations. It works with standard Badger transactions and provides top level functions that mirror those in Badger.

For details on Charm KV, see the Charm KV docs.

Charm FS

Each Charm user has a virtual personal filesystem on the Charm server. Charm FS provides a Go fs.FS implementation for the user along with additional write and delete methods. If you're building a tool that requires file storage, Charm FS will provide it on a networked-basis without friction-filled authentication flows.

import charmfs "github.com/charmbracelet/charm/fs"

// Open the user’s filesystem
cfs, err := charmfs.NewFS()
if err != nil {
    log.Fatal(err)
}

// Save a file
data := bytes.NewBuffer([]byte("some data"))
if err := cfs.WriteFile("./path/to/file", data, fs.FileMode(0644), int64(data.Len())); err != nil {
    log.Fatal(err)
}

// Get a file
f, err := cfs.Open("./path/to/file")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

// Just read whole file in one shot
data, err := cfs.ReadFile("./path/to/file")
if err != nil {
    log.Fatal(err)
}

FAQ

Are there any file size limits?

There are no limitations in file size per se, although there's a 1 GB cap on storage for the free Charm accounts, but you can get unlimited if you self-host the Charm Cloud.

Is it possible to not have a local copy of the database?

No. Skate uses BadgerDB and keeps a local copy of the key-value store. The local databases are synced through the Charm Cloud.

For more on Charm FS see the Charm FS docs.

Charm Crypt

All data sent to a Charm server is fully encrypted on the client. Charm Crypt provides methods for easily encrypting and decrypting data for a Charm user. All key management and account linking is handled seamlessly by Charm.

For more on Charm Crypt see the Charm Crypt docs.

Charm Accounts

The best part of Charm accounts is that both you and your users don’t need to think about them. Charm authentication is based on SSH keys, so account creation and authentication is built into all Charm tools and is invisible and frictionless.

If a user already has Charm keys, we authenticate with them. If not, we create new ones. Users can also easily link multiple machines to their account, and linked machines will seamlessly gain access to their owners Charm data. Of course, users can revoke machines’ access too.

Backups

You can use charm backup-keys to backup your account keys. Your account can be recovered using charm import-keys charm-keys-backup.tar

Charm Client

The charm binary also includes easy access to a lot of the functionality available in the libraries. This could be useful in scripts, as a standalone utility or when testing functionality.

# Link a machine to your Charm account
charm link

# Set a value
charm kv set weather humid

# Print out a tree of your files
charm fs tree /

# Encrypt something
charm crypt encrypt < secretphoto.jpg > encrypted.jpg.json

# For more info
charm help

Client Settings

The Charm client can be configured using environment variables. These are the defaults:

  • CHARM_HOST: Server public URL (default cloud.charm.sh)
  • CHARM_SSH_PORT: SSH port to connect to (default 35353)
  • CHARM_HTTP_PORT: HTTP port to connect to (default 35354)
  • CHARM_DEBUG: Whether debugging logs are enabled (default false)
  • CHARM_LOGFILE: The file path to output debug logs
  • CHARM_KEY_TYPE: The type of key to create for new users (default ed25519)
  • CHARM_DATA_DIR: The path to where the user data is stored
  • CHARM_IDENTITY_KEY: The path to the identity key used for auth

Self-Hosting

Charm libraries point at our Charmbracelet, Inc. servers by default (that’s cloud.charm.sh), however it's very easy for users to host their own Charm instances. The charm binary is a single, statically-linked executable capable of serving an entire Charm instance:

charm serve

Server settings

The Charm server can be configured using environment variables. These are the defaults:

  • CHARM_SERVER_BIND_ADDRESS: Network interface to listen to (default 0.0.0.0)
  • CHARM_SERVER_HOST: Hostname to advertise (default localhost)
  • CHARM_SERVER_SSH_PORT: SSH server port to listen to (default 35353)
  • CHARM_SERVER_HTTP_PORT: HTTP server port to listen to (default 35354)
  • CHARM_SERVER_STATS_PORT: Stats server port to listen to (default 35355)
  • CHARM_SERVER_HEALTH_PORT: Health server port to listen to (default 35356)
  • CHARM_SERVER_DATA_DIR: Server data directory (default ./data)
  • CHARM_SERVER_USE_TLS: Whether to use TLS (default false)
  • CHARM_SERVER_TLS_KEY_FILE: The TLS key file path to use
  • CHARM_SERVER_TLS_CERT_FILE: The TLS cert file path to use
  • CHARM_SERVER_PUBLIC_URL: Server public URL, useful when hosting the Charm server behind a TLS enabled reverse proxy
  • CHARM_SERVER_ENABLE_METRICS: Whether to enable collecting Prometheus metrics (default false) Metrics can be accessed from http://<CHARM_SERVER_HOST>:<CHARM_SERVER_STATS_PORT>/metrics
  • CHARM_SERVER_USER_MAX_STORAGE: Maximum FS storage for a user (default 0) Zero means no limit

To change hosts, users can set CHARM_HOST to the domain or IP of their choosing:

export CHARM_HOST=burrito.example.com

See instructions for Systemd and Docker.

Storage Considerations

The max data you can store on our Charm Cloud servers is 1GB per account. By default, self-hosted servers don't have a data storage limit. Should you want to set a max storage limit on your server, you can do so using CHARM_SERVER_USER_MAX_STORAGE

TLS

To set up TLS, you should set CHARM_SERVER_USE_TLS to true, and specify CHARM_SERVER_HOST, CHARM_SERVER_TLS_KEY_FILE, and CHARM_SERVER_TLS_CERT_FILE file paths.

Projects using Charm

Feedback

We’d love to hear your thoughts on this project. Feel free to drop us a note!

License

MIT


Part of Charm.

the Charm logo

Charmηƒ­ηˆ±εΌ€ζΊ β€’ Charm loves open source

More Repositories

1

bubbletea

A powerful little TUI framework πŸ—
Go
26,561
star
2

gum

A tool for glamorous shell scripts πŸŽ€
Go
17,705
star
3

glow

Render markdown on the CLI, with pizzazz! πŸ’…πŸ»
Go
15,692
star
4

vhs

Your CLI home video recorder πŸ“Ό
Go
14,678
star
5

lipgloss

Style definitions for nice terminal layouts πŸ‘„
Go
7,832
star
6

bubbles

TUI components for Bubble Tea 🫧
Go
5,325
star
7

soft-serve

The mighty, self-hostable Git server for the command line🍦
Go
5,174
star
8

huh

Build terminal forms and prompts πŸ€·πŸ»β€β™€οΈ
Go
3,994
star
9

wish

Make SSH apps, just like that! πŸ’«
Go
3,428
star
10

freeze

Generate images of code and terminal output πŸ“Έ
Go
3,091
star
11

mods

AI on the command line
Go
2,830
star
12

pop

Send emails from your terminal πŸ“¬
Go
2,382
star
13

glamour

Stylesheet-based markdown rendering for your CLI apps πŸ’‡πŸ»β€β™€οΈ
Go
2,369
star
14

log

A minimal, colorful Go logging library πŸͺ΅
Go
2,284
star
15

skate

A personal key value store πŸ›Ό
Go
1,326
star
16

wishlist

The SSH directory ✨
Go
1,074
star
17

harmonica

A simple, physics-based animation library 🎼
Go
1,020
star
18

melt

Backup and restore Ed25519 SSH keys with seed words 🫠
Go
579
star
19

kancli

A tutorial for building a command line kanban board in Go
Go
172
star
20

vhs-action

Keep your GIFs up to date with VHS + GitHub actions πŸ“½οΈ
TypeScript
163
star
21

bubbletea-app-template

A template repository to create Bubbletea apps.
Go
131
star
22

x

Charm experimental packages
Go
125
star
23

keygen

An SSH key pair generator πŸ—οΈ
Go
109
star
24

taskcli

A tutorial for building a Taskwarrior-inspired task tracker in Go using glamorous CLI libraries
Go
97
star
25

inspo

Share and explore projects you can build with Charm libraries
93
star
26

wizard-tutorial

A basic wizard made with Bubble Tea and Lip Gloss. Follow along with the tutorial video for this project:
Go
81
star
27

tree-sitter-vhs

Syntax highlighting for VHS with tree-sitter 🌳
JavaScript
79
star
28

confettysh

confetti over ssh
Go
56
star
29

git-lfs-transfer

Server-side implementation of the Git LFS pure-SSH protocol
Go
50
star
30

catwalk

Open source 3D models from Charm 🧸
50
star
31

soft-serve-action

Synchronize GitHub repositories to your Soft Serve instance 🍦
47
star
32

promwish

Prometheus middleware for Wish
Go
41
star
33

meta

Charm's meta configuration files πŸ«₯
25
star
34

hotdiva2000

A human-readable random string generator πŸ‘‘
Go
25
star
35

homebrew-tap

Our homebrew tap 🍺
Ruby
23
star
36

scoop-bucket

Charmbracelet Scoop Bucket
15
star
37

nur

Nix
14
star
38

.github

Default community health files
2
star