A tasty, self-hosted Git server for the command line🍦

Soft Serve

A nice rendering of some melting ice cream with the words ‘Charm Soft Serve’ next to it
Latest Release Build Status

A tasty, self-hosted Git server for the command line. 🍦

Soft Serve screencast

  • Configure with git
  • Create repos on demand with git push
  • Browse repos with an SSH-accessible TUI
  • Easy access control
    • Allow/disallow anonymous access
    • Add collaborators with SSH public keys
    • Repos can be public or private

Where can I see it?

Just run ssh git.charm.sh for an example.

Installation

Soft Serve is a single binary called soft. You can get it from a package manager:

# macOS or Linux
brew tap charmbracelet/tap && brew install charmbracelet/tap/soft-serve

# Arch Linux
yay -S soft-serve

You can also download a binary from the [releases][releases] page. Packages are available in Alpine, Debian, and RPM formats. Binaries are available for Linux, macOS, and Windows.

Or just build and install it with go:

git clone ssh://git.charm.sh/soft-serve
cd soft-serve
go install

Setting up a server

Make sure git is installed, then run soft. That’s it.

A Docker image is also available.

Configuration

The Soft Serve configuration is simple and straightforward:

# The name of the server to show in the TUI.
name: Soft Serve

# The host and port to listen on. Defaults to 0.0.0.0:23231.
host: localhost
port: 23231

# The access level for anonymous users. Options are: read-write, read-only
# and no-access.
anon-access: read-write

# You can grant read-only access to users without private keys.
allow-keyless: false

# Which repos should appear in the menu?
repos:
  - name: Home
    repo: config
    private: true
    note: "Configuration and content repo for this server"
  - name: Example Public Repo
    repo: my-public-repo
    private: false
    note: "A publicly-accessible repo"
  - name: Example Private Repo
    repo: my-private-repo
    private: true
    note: "A private repo"

# Authorized users. Admins have full access to all repos. Regular users
# can read all repos and push to their collab-repos.
users:
  - name: Beatrice
    admin: true
    public-keys:
      - KEY TEXT
  - name: Frankie
    collab-repos:
      - my-public-repo
      - my-private-repo
    public-keys:
      - KEY TEXT

When soft is run for the first time, it creates a configuration repo containing the main README displayed in the TUI as well as a config file for user access control.

git clone ssh://localhost:23231/config

The config repo is publicly writable by default, so be sure to setup your access as desired. You can also set the SOFT_SERVE_INITIAL_ADMIN_KEY environment variable before first run and it will restrict access to that initial public key until you configure things otherwise.

Pushing (and creating!) repos

You can add your Soft Serve server as a remote to any existing repo:

git remote add soft ssh://localhost:23231/REPO

After you’ve added the remote just go ahead and push. If the repo doesn’t exist on the server it’ll be created.

git push soft main

The Soft Serve TUI

Soft Serve serves a TUI over SSH for browsing repos, viewing READMEs, and grabbing clone commands:

ssh localhost -p 23231

It's also possible to “link” to a specific repo:

ssh localhost -t -p 23231 REPO

Server Settings

In addition to the Git-based configuration above, there are a few environment-level settings:

  • SOFT_SERVE_PORT: SSH listen port (default 23231)
  • SOFT_SERVE_HOST: SSH listen host (default 0.0.0.0)
  • SOFT_SERVE_KEY_PATH: SSH host key-pair path (default .ssh/soft_serve_server_ed25519)
  • SOFT_SERVE_REPO_PATH: Path where repos are stored (default .repos)
  • SOFT_SERVE_INITIAL_ADMIN_KEY: The public key that will initially have admin access to repos (default ""). This must be set before soft runs for the first time and creates the config repo. If set after the config repo has been created, this setting has no effect.

License

MIT


Part of Charm.

The Charm logo

Charm热爱开源 • Charm loves open source

Owner
Charm
We build tools to make the command line glamorous
Charm
Comments
  • Beginner issue: what is the format for the authorized user keys in config.yaml?

    Beginner issue: what is the format for the authorized user keys in config.yaml?

    Hello! I know this is a beginner's issue, but I've been pulling my hair out over trying to get user keys working.

    The example lists this format for creating authorized users:

    users:
      - name: Beatrice
        admin: true
        public-keys:
          - KEY TEXT
    

    To me, KEY TEXT was vague, and ended up trying the following options without success:

    1. copy and pasted the full public SSH key (in rsa format)
    2. name of the public SSH key file in .ssh
    3. full path to the public ssh key file in .ssh

    Every time I got the error bad yaml in config.yaml: yaml: line 25: did not find expected key

    I know I'm missing something obvious, is there a specific file that the ssh key needs to be stored in first? Is the format incorrect? Any help would be great.

    I'm running soft on a debian server, and I installed using homebrew.

  • Permission denied accessing config, while documentation states it is open by default.

    Permission denied accessing config, while documentation states it is open by default.

    The documentation states the following:

    The config repo is publicly writable by default, so be sure to setup your access as desired. You can also set the SOFT_SERVE_INITIAL_ADMIN_KEY environment variable before first run and it will restrict access to that initial public key until you configure things otherwise.

    I can run the server, but when I try to connect, either with ssh localhost -p 23231 or clonning the config repo with git clone ssh://localhost:23231/config, it prompts me for a password, and no matter what I input, it says Permission denied.

    I've been able to connect to the server after editing the configuration using a direct folder clone (git clone /home/myuser/.repos/config) and setting allow-keyless to True and restarting the server.

    I'm not sure if the solution should be updating the documentation or changing the default behaviour, but in any case something should be changed.

    I hope this report helps, thanks for the nice program!

  • systemd ignoring SOFT_SERVE_HOST but all env vars respected when binary launched with `soft`

    systemd ignoring SOFT_SERVE_HOST but all env vars respected when binary launched with `soft`

    Issue: The SOFT_SERVE_HOST environment variable is not being respected when soft is launched with systemd, causing the git clone address to read localhost instead of SOFT_SERVE_HOST in the TUI. However, when running soft with the service disabled in systemctl and all the same environment variables set, the git clone address will show the correct SOFT_SERVE_HOST value.

    Steps to reproduce (this was done on a fresh VM running Debian 11):

    1. Set environment variables in /etc/environment:
    SOFT_SERVE_PORT="23231"
    SOFT_SERVE_BIND_ADDRESS="0.0.0.0"
    SOFT_SERVE_KEY_PATH="/home/ops/.ssh/soft_serve_server_ed25519"
    SOFT_SERVE_REPO_PATH="/home/ops/.repos"
    SOFT_SERVE_INITIAL_ADMIN_KEY="/home/ops/.ssh/id_ed25519.pub"
    SOFT_SERVE_HOST="vcs.hazyville.net"
    
    1. install git, soft serve
    2. launch with soft and ssh to the TUI

    Note the git clone address correctly reflects the SOFT_SERVE_HOST.

    1. create unit file at /etc/systemd/system/soft.service, enable correct perms, with the following content:
    [Unit]
    Description=hazyville.net softserve instance
    After=network.target
    
    [Service]
    Type=simple
    Restart=always
    RestartSec=1
    ExecStart=/usr/bin/soft soft
    
    
    [Install]
    WantedBy=multi-user.target
    
    1. enable soft.service in systemctl and restart the host

    2. ssh into soft TUI and note the git clone address is now using localhost

    3. Stuff I tried that didn't work:

    • added this line in the [Service] stanza:
    PassEnvironment=SOFT_SERVE_HOST
    
    • added the env vars into the user ~/.profile as exports
    • adding a wait timer to the service to ensure all vars loaded before service
    • ssh from directly on the soft host and from remotes (all had same issue if soft had been launched with systemd)
    1. Disabling the service in systemctl and relaunching with soft with no changes to the env vars will result in correct SOFT_SERVE_HOST in the TUI.
  • Soft serve bummer missing repo

    Soft serve bummer missing repo

    when running:

    ssh git.local -p 23231
    

    I get "Bummer missing repo" and I can't seem to figure out why. Does anybody know why this is happening? My config:

    # The name of the server to show in the TUI.
    name: Soft Serve
    
    # The host and port to display in the TUI. You may want to change this if your
    # server is accessible from a different host and/or port that what it's
    # actually listening on (for example, if it's behind a reverse proxy).
    host: git.local
    port: 23231
    
    # Access level for anonymous users. Options are: read-write, read-only and
    # no-access.
    anon-access: read-write
    
    # You can grant read-only access to users without private keys. Any password
    # will be accepted.
    allow-keyless: false
    
    # Customize repo display in the menu. Only repos in this list will appear in
    # the TUI.
    repos:
      - name: Home
        repo: config
        private: true
        note: "Configuration and content repo for this server"
    
    users:
       - name: Admin
         admin: true
         public-keys:
           - [REDACTED]
    #   - name: Example User
    #     collab-repos:
    #       - REPO
    #     public-keys:
    #       - ssh-ed25519 AAAA... # redacted
    #       - ssh-rsa AAAAB3Nz... # redacted
    
  • Allow for groups of repos

    Allow for groups of repos

    Basically: directories. Grouping repos into directories helps in organisation. Example repos:

    ssh://git.example.soft/bla1 ssh://git.example.soft/group1/bla2 ssh://git.example.soft/group1/bla3 ssh://git.example.soft/group1/subgroup1/bla4 ssh://git.example.soft/group1/subgroup1/bla5

  • Run soft-serve as non-root on port 22

    Run soft-serve as non-root on port 22

    • Fix default config repo first commit time
    • Fix allowing keyless when no pk provided
    • Expose ssh server Serve() to listen on a custom net.Listener
    • Add running soft-serve as a non root on port 22 example

    Closes: https://github.com/charmbracelet/soft-serve/issues/116

    EDIT: to test this out go build ./examples/setuid && sudo ./setuid

  • Implement syscall.Setgid/syscall.Setuid

    Implement syscall.Setgid/syscall.Setuid

    One thing that has stopped me from running soft-serve is the fact that it doesn't support binding to port 22 and then dropping the root privileges required to do so, from what I found. Please correct me if I might have overlooked something in the documentation.

    It would be nice if there was a way to make soft-serve start as root, open the port and then drop to a different user (e.g. git) in order to run the actual service.

  • Doesn't seem to work correctly on Windows...

    Doesn't seem to work correctly on Windows...

    If I run this on Windows, (installing via go install as shown in the README) then using the Windows command line git client fails with an unexpected protocol error.

    git clone ssh://localhost:23231/config
    Cloning into 'config'...
    fatal: protocol error: unexpected 'something went wrong'
    

    Hosting soft-serve on Windows and accessing the TUI works fine for both Linux and Windows SSH clients.

    Hosting soft-serve on Windows and cloning using git clients on both Linux and Windows fails with the above error.

    Hosting soft-serve on Linux and using the TUI from Windows SSH and git clients works fine.

    Hosting soft-serve on Linux and using the SSH protocol to clone on Windows and Linux both work fine.

    I can't imagine that this will be a high priority, but I felt it worthy of an issue, because it is an issue. I don't know if it's soft-serve's issue, but it is an issue.

  • reference not found when running soft

    reference not found when running soft

    I think I accidentally screwed up my config file and now I get:

    reference not found
    

    when running soft Does anybody know where the config file is stored locally on the server so I can delete it and start again?

  • Soft Serve does not support custom terminfo files (such as kitty)

    Soft Serve does not support custom terminfo files (such as kitty)

    The Problem

    When attempting to connect to a TUI that runs Soft Serve (such as git.charm.sh, or localhost:23231 when running soft locally, the SSH session immediately exists after initially connecting.

    Looking at the logs for the soft program, it appears to output a shell script that should run on the client. Looking at the verbose logs for SSH, the shell script is only partially received and the SSH connection then closes. (Notably, the SSH connection exits without producing an error.)

    Working with git on the server works as expected. git clone ssh://localhost:23231/config succeeded, and I was able to edit and push a new configuration up with no issues.

    Host Information

    OS: NixOS 22.05 (Unstable)
    Kernel: Linux 5.16.2
    Shell: ZSH 5.8
    SSH Version: OpenSSH 8.8p1
    Terminal: kitty
    $TERM: xterm-kitty
    

    Screenshots & Logs

    Attempting to connect (-S none to disable multiplexed connection): image

    SSH log (with -v): http://ix.io/3Nu2

    Soft log: http://ix.io/3Nu3

  • First run on Windows fails with mkdir error

    First run on Windows fails with mkdir error

    I am running Windows 11. After downloading soft-serve_0.1.0_Windows_x86_64.zip and extracting the .exe file, running soft gives:

    C:\Users\MyName>soft
    2021/12/09 08:21:04 mkdir : The system cannot find the path specified.
    

    This error is repeated for trying soft --help, soft -h, soft /? and any other likely command-line switches for help.

    Whereas when I try the .deb package in Ubuntu running in WSL2, I get the expected result:

    MyName@MyComputer:~$ soft
    2021/12/09 08:29:58 Starting SSH server on :23231
    
  • Feature Request: Branch Diffs

    Feature Request: Branch Diffs

    Is your feature request related to a problem? Please describe. No problem

    Describe the solution you'd like It would be useful if there was a branch diff view, where you can compare diffs against two branches. This would make it really easy to perform a code review for a merge.

    Describe alternatives you've considered cgit and gitweb have this functionality and it's really useful.

    Additional context

  • feat(deps): bump github.com/go-git/go-git/v5 from 5.4.2 to 5.5.2

    feat(deps): bump github.com/go-git/go-git/v5 from 5.4.2 to 5.5.2

    Bumps github.com/go-git/go-git/v5 from 5.4.2 to 5.5.2.

    Release notes

    Sourced from github.com/go-git/go-git/v5's releases.

    v5.5.2

    What's Changed

    Full Changelog: https://github.com/go-git/go-git/compare/v5.5.1...v5.5.2

    v5.5.1

    What's Changed

    Full Changelog: https://github.com/go-git/go-git/compare/v5.5.0...v5.5.1

    v5.5.0

    What's Changed

    ... (truncated)

    Commits
    • 5dabd83 Worktree: Add, fix add removed files. Fixes #223 (#652)
    • 6839cd5 Merge pull request #653 from go-git/billy
    • 0162fb1 go.mod: update go-billy v5.4.0, removes races
    • 736622f .github: test, remove coveralls
    • e43edee Merge pull request #617 from doxsch/616-update-ssh-agent-to-master
    • f62ac39 Merge pull request #625 from pjbgf/bump-sha1cd-nocgo
    • c7050e7 Merge pull request #623 from pjbgf/empty-commit
    • 08db65f fix: Upgrade github.com/xanzy/ssh-agent to v0.3.3 to fix panic
    • a513415 Return error instead of creating empty commits
    • 223e732 build: Bump github.com/pjbgf/sha1cd to v0.2.3
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • feat(deps): bump github.com/charmbracelet/wish from 0.7.0 to 1.0.0

    feat(deps): bump github.com/charmbracelet/wish from 0.7.0 to 1.0.0

    Bumps github.com/charmbracelet/wish from 0.7.0 to 1.0.0.

    Release notes

    Sourced from github.com/charmbracelet/wish's releases.

    v1.0.0

    Changelog

    💫 Wish v1.0.0 replaces the amazing gliderlabs/ssh with charmbracelet/ssh, which is a fork of the former under our control. This should help us ship new features and improvements faster, and all changes are submitted back to GliderLabs.

    This change, however, requires you to change import paths. But don't fire your seds and search/replaces yet, you can do it with gofmt:

    go get github.com/charmbracelet/wish@latest
    gofmt -l -w -r '"github.com/gliderlabs/ssh" -> "github.com/charmbracelet/ssh"' .
    go mod tidy
    

    New Features

    • d65a162838189010bd8ad5c539fe876c03b0ec3c: feat: using our fork (#101) (@​caarlos0)

    Bug fixes

    • 2eed2c119561980b6401979b806c78815946bb2c: fix(git): tests: quote ssh key path (@​aymanbagabas)
    • 9e9765dfded5d6400a12af8bb1b94d9d66352c1e: fix: fd leaks, tests on windows (#103) (@​caarlos0)
    • 0e4e2e5642c2af0cbefc6412042a9632d83115e8: fix: scp bug when copying / (#104) (@​caarlos0)
    • a14cf6d38a86e356e527692eff989b1dc45ce86d: fix: using our ssh fork (#95) (@​caarlos0)

    Dependency updates

    • 0185fd6c61ef967b91b83faba0012ad8b76aef69: feat(deps): bump github.com/go-git/go-git/v5 from 5.4.2 to 5.5.1 (#108) (@​dependabot[bot])
    • 7fe3248bf50f5bb2122bae57a0e9f07f1821462d: feat(deps): bump github.com/google/go-cmp from 0.5.5 to 0.5.9 (#106) (@​dependabot[bot])

    Documentation updates

    • 0857eb6b716a5c745baf699a06da76f76bb73b84: docs: document a little bit how wish works (#99) (@​caarlos0)

    Other work

    • c4e54902ed25009a9fdfc6d9dfd49f2ef14b8006: feat(ci): use meta workflows (@​aymanbagabas)
    • f7f0c95e872b6c308ed46d2a14be8b17ec4c889e: refactor: type aliasing ssh types (#94) (@​caarlos0)

    Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or on Discord.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • go install error on OpenWrt

    go install error on OpenWrt

    Describe the bug I wanted to install soft-serve on my SBC running OpenWrt (probably the most overkill router ever? 4+4 cores with gpu xD) to synchronize my dotfiles and other important configuration.

    However, when I went to install it:

    root@FriendlyWrt /etc# go install github.com/charmbracelet/soft-serve/cmd/soft@latest
    go: downloading github.com/charmbracelet/soft-serve v0.4.4
    go: github.com/charmbracelet/soft-serve/cmd/soft@latest (in github.com/charmbracelet/[email protected]):
            The go.mod file for the module providing named packages contains one or
            more exclude directives. It must not contain directives that would cause
            it to be interpreted differently than if it were the main module.
    

    Any idea? I took the command from your readme.

    To Reproduce Steps to reproduce the behavior:

    1. Use the "go install" command from the readme.

    Expected behavior I expected to see Go build and subsequently install soft-serve.

    Screenshots Output above.

    Environment (please complete the following information):

    • OS: OpenWrt 22.03 (FriendlyWrt fork) (GNU/Linux kernel 5.10.110)
    • Terminal Windows Terminal + ssh
    • Version @latest
    • Go version: 1.19
    • uname -a: Linux FriendlyWrt 5.10.110 #1 SMP Sat Dec 3 01:25:15 CST 2022 aarch64 GNU/Linux

    Additional context I haven't tried to install from git, I just tried to see if this would work out of the box witht he go install command. Makes management a little easier. :)

  • Use different branch name as the default

    Use different branch name as the default

    To align with the default from various other forges (GitHub, GitLab, Gitea, etc..), and the git client itself. I've updated the default branch name for new repos to match.

  • Feature Request: Search/Filter in Files tab

    Feature Request: Search/Filter in Files tab

    It would be nice to have the same search functionality as in repos tab. Just a filtre for filenames. I have some repos with many files, and it take some time to find a good one :)

Related tags
Gogs is a painless self-hosted Git service
Gogs is a painless self-hosted Git service

Gogs - A painless self-hosted Git service 简体中文 ?? Vision The Gogs (/gɑgz/) project aims to build a simple, stable and extensible self-hosted Git servi

Jan 9, 2023
A command-line tool that makes git easier to use with GitHub.

hub is a command line tool that wraps git in order to extend it with extra features and commands that make working with GitHub easier. For an official

Jan 1, 2023
ReGit: A Tiny Git-Compatible Git Implementation written in Golang

ReGit is a tiny Git implementation written in Golang. It uses the same underlying file formats as Git. Therefore, all the changes made by ReGit can be checked by Git.

Oct 31, 2022
A Git RPC service for handling all the git calls made by GitLab
A Git RPC service for handling all the git calls made by GitLab

Quick Links: Roadmap | Want to Contribute? | GitLab Gitaly Issues | GitLab Gitaly Merge Requests | Gitaly is a Git RPC service for handling all the gi

Nov 13, 2021
A simple cli tool for switching git user easily inspired by Git-User-Switch
A simple cli tool for switching git user easily inspired by Git-User-Switch

gitsu A simple cli tool for switching git user easily inspired by Git-User-Switch Installation Binary releases are here. Homebrew brew install matsuyo

Dec 31, 2022
Removes unnecessarily saved git objects to optimize the size of the .git directory.

Git Repo Cleaner Optimizes the size of the .git directory by removing all of the files that are unnecessarily-still-saved as part of the git history.

Mar 24, 2022
Gum - Git User Manager (GUM) - Switch between git user profiles
Gum - Git User Manager (GUM) - Switch between git user profiles

Git User Manager (GUM) Add your profile info to config.yaml Build project: go bu

Feb 14, 2022
Git-now-playing - Git commits are the new AIM status messages

git-now-playing git-now-playing is an attempt to bring some of the panache of th

Apr 4, 2022
A highly extensible Git implementation in pure Go.
A highly extensible Git implementation in pure Go.

go-git is a highly extensible git implementation library written in pure Go. It can be used to manipulate git repositories at low level (plumbing) or

Jan 8, 2023
commit/branch/workdir explorer for git

gitin gitin is a commit/branch/status explorer for git gitin is a minimalist tool that lets you explore a git repository from the command line. You ca

Dec 31, 2022
A tool to monitor git repositories and automatically pull & push changes

git-o-matic A tool to monitor git repositories and automatically pull & push changes Installation Packages & Binaries Arch Linux: gitomatic Binaries f

Dec 20, 2022
SQL interface to git repositories, written in Go. https://docs.sourced.tech/gitbase

gitbase gitbase, is a SQL database interface to Git repositories. This project is now part of source{d} Community Edition, which provides the simplest

Dec 25, 2022
Fast and powerful Git hooks manager for any type of projects.
Fast and powerful Git hooks manager for any type of projects.

Lefthook The fastest polyglot Git hooks manager out there Fast and powerful Git hooks manager for Node.js, Ruby or any other type of projects. Fast. I

Jan 4, 2023
Implementation of git internals from scratch in Go language
Implementation of git internals from scratch in Go language

This project is part of a learning exercise to implement a subset of "git" commands. It can be used to create and maintain git objects, such as blobs, trees, commits, references and tags.

Nov 27, 2022
A Simple and Comprehensive Vulnerability Scanner for Container Images, Git Repositories and Filesystems. Suitable for CI
A Simple and Comprehensive Vulnerability Scanner for Container Images, Git Repositories and Filesystems. Suitable for CI

A Simple and Comprehensive Vulnerability Scanner for Containers and other Artifacts, Suitable for CI. Abstract Trivy (tri pronounced like trigger, vy

Jan 9, 2023
go mod vendor lets you check in your dependencies to git, but that's both bloaty (for developers) and tedious (remembering to update it).

go-mod-archiver Afraid of being unable to build historical versions of your Go program? go mod vendor lets you check in your dependencies to git, but

Dec 1, 2022
Quickly clone git repositories into a nested folders like GOPATH.

cl cl clones git repositories into nested folders like GOPATH and outputs the path of the cloned directory. Example: cl https://github.com/foo/bar Is

Nov 30, 2022
Switch between your git profiles easily
Switch between your git profiles easily

Git Profile Switcher Switch between your git profiles easily Install With Brew brew install theykk/tap/git-switcher With golang go get github.com/the

Dec 11, 2022
Store private data inside a git repository.

git-private lets you store private data inside a git repo. A common use case is protecting files containing API keys et.c.

Nov 13, 2022