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