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

Related tags

Git soft-serve
Overview

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

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.

    opened by wychwitch 17
  • 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!

    opened by Temporalin 10
  • 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.
    opened by mmar80 6
  • 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
    
    question 
    opened by maxall41 5
  • 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

    opened by aymanbagabas 4
  • 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.

    enhancement 
    opened by mrusme 4
  • 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.

    opened by naikrovek 3
  • 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?

    opened by maxall41 3
  • 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

    opened by Infinidoge 3
  • 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:

    [email protected]:~$ soft
    2021/12/09 08:29:58 Starting SSH server on :23231
    
    bug 
    opened by stevesimmons 3
  • Can't connect to server

    Can't connect to server

    I'm not sure what's changed, but suddenly I can't connect to the local softserve server. I'm using the same keys, and the server seems to start successfully, but when I try to connect the interface appears, reads "Filter:" + a string of characters, then closes the connection.

    opened by maxdiebold-erg 2
  • feat(deps): bump github.com/muesli/termenv from 0.12.0 to 0.13.0

    feat(deps): bump github.com/muesli/termenv from 0.12.0 to 0.13.0

    Bumps github.com/muesli/termenv from 0.12.0 to 0.13.0.

    Release notes

    Sourced from github.com/muesli/termenv's releases.

    v0.13.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/muesli/termenv/compare/v0.12.0...v0.13.0

    Commits
    • d5ed323 docs: fix template helper documentation
    • 642b8df feat: conveniently access an Output's template func map
    • 6dd5b52 fix(templatehelper): no styles in Ascii mode
    • 031d09c Bump github.com/mattn/go-runewidth from 0.0.13 to 0.0.14
    • 4ee266f Bump github.com/mattn/go-isatty from 0.0.14 to 0.0.16
    • 8a46876 Bump golangci/golangci-lint-action from 2 to 3
    • 545df67 chore: add dependabot config
    • c2e45bf Use EnableVirtualTerminalProcessing in README.md and examples
    • 9628829 Add EnableVirtualTerminalProcessing function
    • 30c93e6 chore: bump GitHub Action versions
    • 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)
    dependencies 
    opened by dependabot[bot] 0
  • Please make sure you have the correct access rights

    Please make sure you have the correct access rights

    just following this video on Windows 11: https://www.youtube.com/watch?v=UR_MWNVcsa4 and getting this error

    I also tried running powershell with administrator permission same error

    [20:53:27]   ~\..\..\softserve on❯ git clone ssh://localhost:23231/config
    Cloning into 'config'...
    ssh: connect to host localhost port 23231: Connection refused
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    
    opened by AbhimanyuAryan 0
  • feat(deps): bump github.com/caarlos0/env/v6 from 6.10.0 to 6.10.1

    feat(deps): bump github.com/caarlos0/env/v6 from 6.10.0 to 6.10.1

    Bumps github.com/caarlos0/env/v6 from 6.10.0 to 6.10.1.

    Release notes

    Sourced from github.com/caarlos0/env/v6's releases.

    v6.10.1

    Changelog

    Bug fixes

    • f3ddf1f7ee602a224429717ddc431e9083d45882: fix: non empty struct pointer value (#236) (@​akutuev)

    Released with GoReleaser Pro!

    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)
    dependencies 
    opened by dependabot[bot] 0
  • feat(deps): bump github.com/charmbracelet/lipgloss from 0.5.0 to 0.6.0

    feat(deps): bump github.com/charmbracelet/lipgloss from 0.5.0 to 0.6.0

    Bumps github.com/charmbracelet/lipgloss from 0.5.0 to 0.6.0.

    Release notes

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

    v0.6.0

    Vertical Alignment

    In this latest release of Lip Gloss, styles now support vertical alignment for all your vertical alignment needs!

    Align content in a Style vertically at the top, center, or bottom. To get started make a style with some Height and an AlignVertical property.

    lipgloss.NewStyle().Height(5).AlignVertical(lipgloss.Center).Render("Hello, Center!")
    

    or use the Align shorthand which sets both horizontal and vertical alignments:

    lipgloss.NewStyle().Height(5).Align(lipgloss.Left, lipgloss.Bottom).Render("Hello, Center!")
    

    New API:

    Note, there are no breaking changes since if the Align shorthand will still accept 1 argument (variadic arguments) and will set only the horizontal alignment to maintain original functionality

    • Align(p ...Position)
    • AlignVertical(p Position)
    • AlignHorizontal(p Position)
    • GetAlignVertical() Position
    • GetAlignHorizontal() Position

    New

    Fixed

    New Contributors

    Full Changelog: https://github.com/charmbracelet/lipgloss/compare/v0.5.0...v0.6.0


    ... (truncated)

    Commits
    • 0ce5550 feat: Align takes multiple arguments for setting horizontal + vertical alignment
    • 9852bb3 feat: VerticalAlign
    • 0ee74a5 feat: non-interpolated colors, aka CompleteColor (#100)
    • 2cb1d4a docs(lint): update example code in GoDocs per new style standard
    • f651363 Fix height doc (width -> height)
    • 81744be chore(lint): remove magic numbers
    • 1fb1fb9 chore: drop go-colorful dependency (but it's a great lib)
    • e8297c4 Use ReplaceAll instead of Replace with n=-1
    • a86f21a ci: add benchmark test for Style.Render
    • 6b5dc18 Clarify Inherit comment
    • 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)
    dependencies 
    opened by dependabot[bot] 0
  • feat(deps): bump github.com/charmbracelet/bubbles from 0.13.0 to 0.14.0

    feat(deps): bump github.com/charmbracelet/bubbles from 0.13.0 to 0.14.0

    Bumps github.com/charmbracelet/bubbles from 0.13.0 to 0.14.0.

    Release notes

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

    v0.14.0

    Table Bubble

    This feature release of Bubbles includes a brand new table bubble that you can use to show and select tabular data! Huge thanks to @​wesleimp for contributing this change ❤️.

    See the example code for an example of how to use the table in your Bubble Tea applications.

    Getting Started

    Create a new table:

    t := table.New(
    	table.WithColumns(columns),
    	table.WithRows(rows),
    	table.WithFocused(true),
    	table.WithHeight(7),
    )
    

    Alternatively,

    t := table.New(table.WithColumns(columns))
    t.SetRows(rows)
    t.Focus()
    t.SetHeight(7)
    

    Style the table how you want:

    s := table.DefaultStyles()
    s.Header = s.Header.
    	BorderStyle(lipgloss.NormalBorder()).
    	BorderForeground(lipgloss.Color("240")).
    	BorderBottom(true).
    	Bold(false)
    s.Selected = s.Selected.
    	Foreground(lipgloss.Color("229")).
    	Background(lipgloss.Color("57")).
    	Bold(false)
    t.SetStyles(s)
    

    And then Update and Render (View) the table:

    </tr></table> 
    

    ... (truncated)

    Commits
    • 13f52d6 fix(table): append headers/columns to zero sized string slice
    • 278edd1 fix(viewport): properly truncate to size (#228)
    • 09e1f00 textarea: support dynamic prompts
    • c099d31 textarea: add some comments
    • db2a8b4 textarea: new bindings for "go to begin" / "go to end"
    • afd6f58 feat(table): add function to set cursor position (#219)
    • d44e242 fix(viewport): honor width and height settings
    • 776062e fix(table): correct keybinding for page down (#220)
    • 1c26128 textarea: add uppercase/lowercase/capitalize word right (#210)
    • 649f78e fix(textarea): pre-allocation of value (#213)
    • 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)
    dependencies 
    opened by dependabot[bot] 0
  • feat: integrate promwish

    feat: integrate promwish

    Hey, I went ahead and integrated promwish so that users can run the leverage the metrics middleware when running soft serve. I need this personally in order to get some level of liveness checks on a deployment to k8, but also it's just nice to have, figured I would upstream it in case you guys want to offer this out of the box :)

    Opening this as a draft because right now the values are just hard coded. If you guys want to upstream this, I'm happy to put in some leg work to get the metrics middleware behind a flag of some kind, allow users to override the port, etc. etc.

    opened by unredundant 0
Releases(v0.4.0)
Owner
Charm
We build tools to make the command line glamorous
Charm
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

Gogs 41k Oct 2, 2022
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

GitHub 22.1k Sep 28, 2022
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.

null 166 Aug 30, 2022
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

null 1 Nov 13, 2021
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

Masaya Watanabe 202 Sep 15, 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.

Omar Yasser 2 Mar 24, 2022
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

Mehmet Tevfik YÜKSEL 6 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

Paddy 1 Apr 4, 2022
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

go-git 3.9k Oct 2, 2022
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

Ibrahim Serdar Acikgoz 1.8k Sep 22, 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

Christian Muehlhaeuser 1k Sep 21, 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

source{d} 2k Sep 16, 2022
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

Abroskin Alexander 2.4k Sep 25, 2022
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.

Shyamsunder Rathi 36 Aug 30, 2022
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

Aqua Security 14k Sep 25, 2022
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

Tailscale 83 Aug 28, 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

Felix Geisendörfer 12 Jun 2, 2022
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

Kaan Karakaya 213 Sep 20, 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.

Erik Agsjö 9 Jul 25, 2022