1# Soft Serve
  2
  3<p>
  4    <img style="width: 451px" src="https://stuff.charm.sh/soft-serve/soft-serve-header.png?0" alt="A nice rendering of some melting ice cream with the words āCharm Soft Serveā next to it"><br>
  5    <a href="https://github.com/charmbracelet/soft-serve/releases"><img src="https://img.shields.io/github/release/charmbracelet/soft-serve.svg" alt="Latest Release"></a>
  6    <a href="https://pkg.go.dev/github.com/charmbracelet/soft-serve?tab=doc"><img src="https://godoc.org/github.com/golang/gddo?status.svg" alt="GoDoc"></a>
  7    <a href="https://github.com/charmbracelet/soft-serve/actions"><img src="https://github.com/charmbracelet/soft-serve/workflows/build/badge.svg" alt="Build Status"></a>
  8    <a href="https://nightly.link/charmbracelet/soft-serve/workflows/nightly/main"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=appveyor"/></a>
  9</p>
 10
 11A tasty, self-hostable Git server for the command line. š¦
 12
 13<picture>
 14  <source media="(max-width: 750px)" srcset="https://github.com/charmbracelet/soft-serve/assets/42545625/c754c746-dc4c-44a6-9c39-28649264cbf2">
 15  <source media="(min-width: 750px)" width="750" srcset="https://github.com/charmbracelet/soft-serve/assets/42545625/c754c746-dc4c-44a6-9c39-28649264cbf2">
 16  <img src="https://github.com/charmbracelet/soft-serve/assets/42545625/c754c746-dc4c-44a6-9c39-28649264cbf2" alt="Soft Serve screencast">
 17</picture>
 18
 19- Easy to navigate TUI available over SSH
 20- Clone repos over SSH, HTTP, or Git protocol
 21- Git LFS support with both HTTP and SSH backends
 22- Manage repos with SSH
 23- Create repos on demand with SSH or `git push`
 24- Browse repos, files and commits with SSH-accessible UI
 25- Print files over SSH with or without syntax highlighting and line numbers
 26- Easy access control
 27  - SSH authentication using public keys
 28  - Allow/disallow anonymous access
 29  - Add collaborators with SSH public keys
 30  - Repos can be public or private
 31  - User access tokens
 32
 33## Where can I see it?
 34
 35Just run `ssh git.charm.sh` for an example. You can also try some of the following commands:
 36
 37```bash
 38# Jump directly to a repo in the TUI
 39ssh git.charm.sh -t soft-serve
 40
 41# Print out a directory tree for a repo
 42ssh git.charm.sh repo tree soft-serve
 43
 44# Print a specific file
 45ssh git.charm.sh repo blob soft-serve cmd/soft/main.go
 46
 47# Print a file with syntax highlighting and line numbers
 48ssh git.charm.sh repo blob soft-serve cmd/soft/main.go -c -l
 49```
 50
 51Or you can use Soft Serve to browse local repositories using `soft browse
 52[directory]` or running `soft` within a Git repository.
 53
 54## Installation
 55
 56Soft Serve is a single binary called `soft`. You can get it from a package
 57manager:
 58
 59```bash
 60# macOS or Linux
 61brew tap charmbracelet/tap && brew install charmbracelet/tap/soft-serve
 62
 63# Arch Linux
 64pacman -S soft-serve
 65
 66# Nix
 67nix-env -iA nixpkgs.soft-serve
 68
 69# Debian/Ubuntu
 70sudo mkdir -p /etc/apt/keyrings
 71curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
 72echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
 73sudo apt update && sudo apt install soft-serve
 74
 75# Fedora/RHEL
 76echo '[charm]
 77name=Charm
 78baseurl=https://repo.charm.sh/yum/
 79enabled=1
 80gpgcheck=1
 81gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
 82sudo yum install soft-serve
 83```
 84
 85You can also download a binary from the [releases][releases] page. Packages are
 86available in Alpine, Debian, and RPM formats. Binaries are available for Linux,
 87macOS, and Windows.
 88
 89[releases]: https://github.com/charmbracelet/soft-serve/releases
 90
 91Or just install it with `go`:
 92
 93```bash
 94go install github.com/charmbracelet/soft-serve/cmd/soft@latest
 95```
 96
 97A [Docker image][docker] is also available.
 98
 99[docker]: https://github.com/charmbracelet/soft-serve/blob/main/docker.md
100
101## Setting up a server
102
103Make sure `git` is installed, then run `soft serve`. Thatās it.
104
105This will create a `data` directory that will store all the repos, ssh keys,
106and database.
107
108To change the default data path use `SOFT_SERVE_DATA_PATH` environment variable.
109
110```sh
111SOFT_SERVE_DATA_PATH=/var/lib/soft-serve soft serve
112```
113
114When you run Soft Serve for the first time, make sure you have the
115`SOFT_SERVE_INITIAL_ADMIN_KEYS` environment variable is set to your ssh
116authorized key. Any added key to this variable will be treated as admin with
117full privileges.
118
119Using this environment variable, Soft Serve will create a new `admin` user that
120has full privileges. You can rename and change the user settings later.
121
122Check out [Systemd][systemd] on how to run Soft Serve as a service using
123Systemd. Soft Serve packages in our Apt/Yum repositories come with Systemd
124service units.
125
126[systemd]: https://github.com/charmbracelet/soft-serve/blob/main/systemd.md
127
128### Server Configuration
129
130Once you start the server for the first time, the settings will be in
131`config.yaml` under your data directory. The default `config.yaml` is
132self-explanatory and will look like this:
133
134```yaml
135# Soft Serve Server configurations
136
137# The name of the server.
138# This is the name that will be displayed in the UI.
139name: "Soft Serve"
140
141# Log format to use. Valid values are "json", "logfmt", and "text".
142log_format: "text"
143
144# The SSH server configuration.
145ssh:
146  # The address on which the SSH server will listen.
147  listen_addr: ":23231"
148
149  # The public URL of the SSH server.
150  # This is the address that will be used to clone repositories.
151  public_url: "ssh://localhost:23231"
152
153  # The path to the SSH server's private key.
154  key_path: "ssh/soft_serve_host"
155
156  # The path to the SSH server's client private key.
157  # This key will be used to authenticate the server to make git requests to
158  # ssh remotes.
159  client_key_path: "ssh/soft_serve_client"
160
161  # The maximum number of seconds a connection can take.
162  # A value of 0 means no timeout.
163  max_timeout: 0
164
165  # The number of seconds a connection can be idle before it is closed.
166  idle_timeout: 120
167
168# The Git daemon configuration.
169git:
170  # The address on which the Git daemon will listen.
171  listen_addr: ":9418"
172
173  # The maximum number of seconds a connection can take.
174  # A value of 0 means no timeout.
175  max_timeout: 0
176
177  # The number of seconds a connection can be idle before it is closed.
178  idle_timeout: 3
179
180  # The maximum number of concurrent connections.
181  max_connections: 32
182
183# The HTTP server configuration.
184http:
185  # The address on which the HTTP server will listen.
186  listen_addr: ":23232"
187
188  # The path to the TLS private key.
189  tls_key_path: ""
190
191  # The path to the TLS certificate.
192  tls_cert_path: ""
193
194  # The public URL of the HTTP server.
195  # This is the address that will be used to clone repositories.
196  # Make sure to use https:// if you are using TLS.
197  public_url: "http://localhost:23232"
198
199# The database configuration.
200db:
201  # The database driver to use.
202  # Valid values are "sqlite" and "postgres".
203  driver: "sqlite"
204  # The database data source name.
205  # This is driver specific and can be a file path or connection string.
206  # Make sure foreign key support is enabled when using SQLite.
207  data_source: "soft-serve.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)"
208
209# Git LFS configuration.
210lfs:
211  # Enable Git LFS.
212  enabled: true
213  # Enable Git SSH transfer.
214  ssh_enabled: false
215
216# Cron job configuration
217jobs:
218  mirror_pull: "@every 10m"
219
220# The stats server configuration.
221stats:
222  # The address on which the stats server will listen.
223  listen_addr: ":23233"
224# Additional admin keys.
225#initial_admin_keys:
226#  - "ssh-rsa AAAAB3NzaC1yc2..."
227```
228
229You can also use environment variables, to override these settings. All server
230settings environment variables start with `SOFT_SERVE_` followed by the setting
231name all in uppercase. Here are some examples:
232
233- `SOFT_SERVE_NAME`: The name of the server that will appear in the TUI
234- `SOFT_SERVE_SSH_LISTEN_ADDR`: SSH listen address
235- `SOFT_SERVE_SSH_KEY_PATH`: SSH host key-pair path
236- `SOFT_SERVE_HTTP_LISTEN_ADDR`: HTTP listen address
237- `SOFT_SERVE_HTTP_PUBLIC_URL`: HTTP public URL used for cloning
238- `SOFT_SERVE_GIT_MAX_CONNECTIONS`: The number of simultaneous connections to git daemon
239
240#### Database Configuration
241
242Soft Serve supports both SQLite and Postgres for its database. Like all other Soft Serve settings, you can change the database _driver_ and _data source_ using either `config.yaml` or environment variables. The default config uses SQLite as the default database driver.
243
244To use Postgres as your database, first create a Soft Serve database:
245
246```sh
247psql -h<hostname> -p<port> -U<user> -c 'CREATE DATABASE soft_serve'
248```
249
250Then set the database _data source_ to point to your Postgres database. For instance, if you're running Postgres locally, using the default user `postgres` and using a database name `soft_serve`, you would have this config in your config file or environment variable:
251
252```
253db:
254  driver: "postgres"
255  data_source: "postgres://postgres@localhost:5432/soft_serve?sslmode=disable"
256```
257
258Environment variables equivalent:
259
260```sh
261SOFT_SERVE_DB_DRIVER=postgres \
262SOFT_SERVE_DB_DATA_SOURCE="postgres://postgres@localhost:5432/soft_serve?sslmode=disable" \
263soft serve
264```
265
266You can specify a database connection password in the _data source_ url. For example, `postgres://myuser:dbpass@localhost:5432/my_soft_serve_db`.
267
268#### LFS Configuration
269
270Soft Serve supports both Git LFS [HTTP](https://github.com/git-lfs/git-lfs/blob/main/docs/api/README.md) and [SSH](https://github.com/git-lfs/git-lfs/blob/main/docs/proposals/ssh_adapter.md) protocols out of the box, there is no need to do any extra set up.
271
272Use the `lfs` config section to customize your Git LFS server.
273
274> **Note**: The pure-SSH transfer is disabled by default.
275
276## Server Access
277
278Soft Serve at its core manages your server authentication and authorization. Authentication verifies the identity of a user, while authorization determines their access rights to a repository.
279
280To manage the server users, access, and repos, you can use the SSH command line interface.
281
282Try `ssh localhost -i ~/.ssh/id_ed25519 -p 23231 help` for more info. Make sure
283you use your key here.
284
285For ease of use, instead of specifying the key, port, and hostname every time
286you SSH into Soft Serve, add your own Soft Serve instance entry to your SSH
287config. For instance, to use `ssh soft` instead of typing `ssh localhost -i
288~/.ssh/id_ed25519 -p 23231`, we can define a `soft` entry in our SSH config
289file `~/.ssh/config`.
290
291```conf
292Host soft
293  HostName localhost
294  Port 23231
295  IdentityFile ~/.ssh/id_ed25519
296```
297
298Now, we can do `ssh soft` to SSH into Soft Serve. Since `git` is also aware of
299this config, you can use `soft` as the hostname for your clone commands.
300
301```sh
302git clone ssh://soft/dotfiles
303# make changes
304# add & commit
305git push origin main
306```
307
308> **Note** The `-i` part will be omitted in the examples below for brevity. You
309> can add your server settings to your sshconfig for quicker access.
310
311### Authentication
312
313Everything that needs authentication is done using SSH. Make sure you have
314added an entry for your Soft Serve instance in your `~/.ssh/config` file.
315
316By default, Soft Serve gives ready-only permission to anonymous connections to
317any of the above protocols. This is controlled by two settings `anon-access`
318and `allow-keyless`.
319
320- `anon-access`: Defines the access level for anonymous users. Available
321  options are `no-access`, `read-only`, `read-write`, and `admin-access`.
322  Default is `read-only`.
323- `allow-keyless`: Whether to allow connections that doesn't use keys to pass.
324  Setting this to `false` would disable access to SSH keyboard-interactive,
325  HTTP, and Git protocol connections. Default is `true`.
326
327```sh
328$ ssh -p 23231 localhost settings
329Manage server settings
330
331Usage:
332  ssh -p 23231 localhost settings [command]
333
334Available Commands:
335  allow-keyless Set or get allow keyless access to repositories
336  anon-access   Set or get the default access level for anonymous users
337
338Flags:
339  -h, --help   help for settings
340
341Use "ssh -p 23231 localhost settings [command] --help" for more information about a command.
342```
343
344> **Note** These settings can only be changed by admins.
345
346When `allow-keyless` is disabled, connections that don't use SSH Public Key
347authentication will get denied. This means cloning repos over HTTP(s) or git://
348will get denied.
349
350Meanwhile, `anon-access` controls the access level granted to connections that
351use SSH Public Key authentication but are not registered users. The default
352setting for this is `read-only`. This will grant anonymous connections that use
353SSH Public Key authentication `read-only` access to public repos.
354
355`anon-access` is also used in combination with `allow-keyless` to determine the
356access level for HTTP(s) and git:// clone requests.
357
358#### SSH
359
360Soft Serve doesn't allow duplicate SSH public keys for users. A public key can be associated with one user only. This makes SSH authentication simple and straight forward, add your public key to your Soft Serve user to be able to access Soft Serve.
361
362#### HTTP
363
364You can generate user access tokens through the SSH command line interface. Access tokens can have an optional expiration date. Use your access token as the basic auth user to access your Soft Serve repos through HTTP.
365
366```sh
367# Create a user token
368ssh -p 23231 localhost token create 'my new token'
369ss_1234abc56789012345678901234de246d798fghi
370
371# Or with an expiry date
372ssh -p 23231 localhost token create --expires-in 1y 'my other token'
373ss_98fghi1234abc56789012345678901234de246d7
374```
375
376Now you can access to repos that require `read-write` access.
377
378```sh
379git clone http://ss_98fghi1234abc56789012345678901234de246d7@localhost:23232/my-private-repo.git my-private-repo
380# Make changes and push
381```
382
383### Authorization
384
385Soft Serve offers a simple access control. There are four access levels,
386no-access, read-only, read-write, and admin-access.
387
388`admin-access` has full control of the server and can make changes to users and repos.
389
390`read-write` access gets full control of repos.
391
392`read-only` can read public repos.
393
394`no-access` denies access to all repos.
395
396## User Management
397
398Admins can manage users and their keys using the `user` command. Once a user is
399created and has access to the server, they can manage their own keys and
400settings.
401
402To create a new user simply use `user create`:
403
404```sh
405# Create a new user
406ssh -p 23231 localhost user create beatrice
407
408# Add user keys
409ssh -p 23231 localhost user add-pubkey beatrice ssh-rsa AAAAB3Nz...
410ssh -p 23231 localhost user add-pubkey beatrice ssh-ed25519 AAAA...
411
412# Create another user with public key
413ssh -p 23231 localhost user create frankie '-k "ssh-ed25519 AAAATzN..."'
414
415# Need help?
416ssh -p 23231 localhost user help
417```
418
419Once a user is created, they get `read-only` access to public repositories.
420They can also create new repositories on the server.
421
422Users can manage their keys using the `pubkey` command:
423
424```sh
425# List user keys
426ssh -p 23231 localhost pubkey list
427
428# Add key
429ssh -p 23231 localhost pubkey add ssh-ed25519 AAAA...
430
431# Wanna change your username?
432ssh -p 23231 localhost set-username yolo
433
434# To display user info
435ssh -p 23231 localhost info
436```
437
438## Repositories
439
440You can manage repositories using the `repo` command.
441
442```sh
443# Run repo help
444$ ssh -p 23231 localhost repo help
445Manage repositories
446
447Usage:
448  ssh -p 23231 localhost repo [command]
449
450Aliases:
451  repo, repos, repository, repositories
452
453Available Commands:
454  blob         Print out the contents of file at path
455  branch       Manage repository branches
456  collab       Manage collaborators
457  create       Create a new repository
458  delete       Delete a repository
459  description  Set or get the description for a repository
460  hide         Hide or unhide a repository
461  import       Import a new repository from remote
462  info         Get information about a repository
463  is-mirror    Whether a repository is a mirror
464  list         List repositories
465  private      Set or get a repository private property
466  project-name Set or get the project name for a repository
467  rename       Rename an existing repository
468  tag          Manage repository tags
469  tree         Print repository tree at path
470
471Flags:
472  -h, --help   help for repo
473
474Use "ssh -p 23231 localhost repo [command] --help" for more information about a command.
475```
476
477To use any of the above `repo` commands, a user must be a collaborator in the repository. More on this below.
478
479### Creating Repositories
480
481To create a repository, first make sure you are a registered user. Use the
482`repo create <repo>` command to create a new repository:
483
484```sh
485# Create a new repository
486ssh -p 23231 localhost repo create icecream
487
488# Create a repo with description
489ssh -p 23231 localhost repo create icecream '-d "This is an Ice Cream description"'
490
491# ... and project name
492ssh -p 23231 localhost repo create icecream '-d "This is an Ice Cream description"' '-n "Ice Cream"'
493
494# I need my repository private!
495ssh -p 23231 localhost repo create icecream -p '-d "This is an Ice Cream description"' '-n "Ice Cream"'
496
497# Help?
498ssh -p 23231 localhost repo create -h
499```
500
501Or you can add your Soft Serve server as a remote to any existing repo, given
502you have write access, and push to remote:
503
504```
505git remote add origin ssh://localhost:23231/icecream
506```
507
508After youāve added the remote just go ahead and push. If the repo doesnāt exist
509on the server itāll be created.
510
511```
512git push origin main
513```
514
515Repositories can be nested too:
516
517```sh
518# Create a new nested repository
519ssh -p 23231 localhost repo create charmbracelet/icecream
520
521# Or ...
522git remote add charm ssh://localhost:23231/charmbracelet/icecream
523git push charm main
524```
525
526### Deleting Repositories
527
528You can delete repositories using the `repo delete <repo>` command.
529
530```sh
531ssh -p 23231 localhost repo delete icecream
532```
533
534### Renaming Repositories
535
536Use the `repo rename <old> <new>` command to rename existing repositories.
537
538```sh
539ssh -p 23231 localhost repo rename icecream vanilla
540```
541
542### Repository Collaborators
543
544Sometimes you want to restrict write access to certain repositories. This can
545be achieved by adding a collaborator to your repository.
546
547Use the `repo collab <command> <repo>` command to manage repo collaborators.
548
549```sh
550# Add collaborator to soft-serve
551ssh -p 23231 localhost repo collab add soft-serve frankie
552
553# Add collaborator with a specific access level
554ssh -p 23231 localhost repo collab add soft-serve beatrice read-only
555
556# Remove collaborator
557ssh -p 23231 localhost repo collab remove soft-serve beatrice
558
559# List collaborators
560ssh -p 23231 localhost repo collab list soft-serve
561```
562
563### Repository Metadata
564
565You can also change the repo's description, project name, whether it's private,
566etc using the `repo <command>` command.
567
568```sh
569# Set description for repo
570ssh -p 23231 localhost repo description icecream "This is a new description"
571
572# Hide repo from listing
573ssh -p 23231 localhost repo hidden icecream true
574
575# List repository info (branches, tags, description, etc)
576ssh -p 23231 localhost repo icecream info
577```
578
579To make a repository private, use `repo private <repo> [true|false]`. Private
580repos can only be accessed by admins and collaborators.
581
582```sh
583ssh -p 23231 localhost repo icecream private true
584```
585
586### Repository Branches & Tags
587
588Use `repo branch` and `repo tag` to list, and delete branches or tags. You can
589also use `repo branch default` to set or get the repository default branch.
590
591### Repository Tree
592
593To print a file tree for the project, just use the `repo tree` command along with
594the repo name as the SSH command to your Soft Serve server:
595
596```sh
597ssh -p 23231 localhost repo tree soft-serve
598```
599
600You can also specify the sub-path and a specific reference or branch.
601
602```sh
603ssh -p 23231 localhost repo tree soft-serve server/config
604ssh -p 23231 localhost repo tree soft-serve main server/config
605```
606
607From there, you can print individual files using the `repo blob` command:
608
609```sh
610ssh -p 23231 localhost repo blob soft-serve cmd/soft/main.go
611```
612
613You can add the `-c` flag to enable syntax coloring and `-l` to print line
614numbers:
615
616```sh
617ssh -p 23231 localhost repo blob soft-serve cmd/soft/main.go -c -l
618
619```
620
621Use `--raw` to print raw file contents. This is useful for dumping binary data.
622
623### Repository webhooks
624
625Soft Serve supports repository webhooks using the `repo webhook` command. You
626can create and manage webhooks for different repository events such as _push_,
627_collaborators_, and _branch_tag_create_ events.
628
629```
630Manage repository webhooks
631
632Usage:
633  ssh -p 23231 localhost repo webhook [command]
634
635Aliases:
636  webhook, webhooks
637
638Available Commands:
639  create      Create a repository webhook
640  delete      Delete a repository webhook
641  deliveries  Manage webhook deliveries
642  list        List repository webhooks
643  update      Update a repository webhook
644
645Flags:
646  -h, --help   help for webhook
647```
648
649## The Soft Serve TUI
650
651<img src="https://stuff.charm.sh/soft-serve/soft-serve-demo-commit.png" width="750" alt="TUI example showing a diff">
652
653Soft Serve TUI is mainly used to browse repos over SSH. You can also use it to
654browse local repositories with `soft browse` or running `soft` within a Git
655repository.
656
657```sh
658ssh localhost -p 23231
659```
660
661It's also possible to ālinkā to a specific repo:
662
663```sh
664ssh -p 23231 localhost -t soft-serve
665```
666
667You can copy text to your clipboard over SSH. For instance, you can press
668<kbd>c</kbd> on the highlighted repo in the menu to copy the clone command
669[^osc52].
670
671[^osc52]:
672    Copying over SSH depends on your terminal support of OSC52. Refer to
673    [go-osc52](https://github.com/aymanbagabas/go-osc52) for more information.
674
675## Hooks
676
677Soft Serve supports git server-side hooks `pre-receive`, `update`,
678`post-update`, and `post-receive`. This means you can define your own hooks to
679run on repository push events. Hooks can be defined as a per-repository hook,
680and/or global hooks that run for all repositories.
681
682You can find per-repository hooks under the repository `hooks` directory.
683
684Globs hooks can be found in your `SOFT_SERVE_DATA_PATH` directory under
685`hooks`. Defining global hooks is useful if you want to run CI/CD for example.
686
687Here's an example of sending a message after receiving a push event. Create an
688executable file `<data path>/hooks/update`:
689
690```sh
691#!/bin/sh
692#
693# An example hook script to echo information about the push
694# and send it to the client.
695
696refname="$1"
697oldrev="$2"
698newrev="$3"
699
700# Safety check
701if [ -z "$GIT_DIR" ]; then
702        echo "Don't run this script from the command line." >&2
703        echo " (if you want, you could supply GIT_DIR then run" >&2
704        echo "  $0 <ref> <oldrev> <newrev>)" >&2
705        exit 1
706fi
707
708if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
709        echo "usage: $0 <ref> <oldrev> <newrev>" >&2
710        exit 1
711fi
712
713# Check types
714# if $newrev is 0000...0000, it's a commit to delete a ref.
715zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
716if [ "$newrev" = "$zero" ]; then
717        newrev_type=delete
718else
719        newrev_type=$(git cat-file -t $newrev)
720fi
721
722echo "Hi from Soft Serve update hook!"
723echo
724echo "RefName: $refname"
725echo "Change Type: $newrev_type"
726echo "Old SHA1: $oldrev"
727echo "New SHA1: $newrev"
728
729exit 0
730```
731
732Now, you should get a message after pushing changes to any repository.
733
734## A note about RSA keys
735
736Unfortunately, due to a shortcoming in Goās `x/crypto/ssh` package, Soft Serve
737does not currently support access via new SSH RSA keys: only the old SHA-1
738ones will work.
739
740Until we sort this out youāll either need an SHA-1 RSA key or a key with
741another algorithm, e.g. Ed25519. Not sure what type of keys you have?
742You can check with the following:
743
744```sh
745$ find ~/.ssh/id_*.pub -exec ssh-keygen -l -f {} \;
746```
747
748If youāre curious about the inner workings of this problem have a look at:
749
750- https://github.com/golang/go/issues/37278
751- https://go-review.googlesource.com/c/crypto/+/220037
752- https://github.com/golang/crypto/pull/197
753
754## Feedback
755
756Weād love to hear your thoughts on this project. Feel free to drop us a note!
757
758- [Twitter](https://twitter.com/charmcli)
759- [The Fediverse](https://mastodon.social/@charmcli)
760- [Discord](https://charm.sh/chat)
761
762## License
763
764[MIT](https://github.com/charmbracelet/soft-serve/raw/main/LICENSE)
765
766---
767
768Part of [Charm](https://charm.sh).
769
770<a href="https://charm.sh/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-badge.jpg" width="400"></a>
771
772Charmēē±å¼ęŗ ⢠Charm loves open source