• Stars
    star
    41
  • Rank 645,269 (Top 14 %)
  • Language
    Go
  • License
    MIT License
  • Created over 5 years ago
  • Updated 12 months ago

Reviews

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

Repository Details

๐Ÿ€ A Bot toolkit for github that supports OAuth, Events, API, Custom Commands and Check Runs.

Hamster Logo

Hamster

A Bot Toolkit for Github!

Documentation

Config & Run The Application

Hamster uses Go Modules to manage dependencies. First Create a dist config file.

$ cp config.json config.dist.json

Then add your app_mode, app_port, app_log_level, github_token, github_webhook_secret, repository_author and repository_name

{
    "app_mode": "prod",
    "app_port": "8080",
    "app_log_level": "info",
    "github_token": "...",
    "github_webhook_secret": "...",
    "repository_author": "Clivern",
    "repository_name": "Hamster",

    "app_domain": "example.com",
    "github_app_client_id": "..",
    "github_app_redirect_uri": "..",
    "github_app_allow_signup": "true",
    "github_app_scope": "..",
    "github_app_client_secret": ".."
}

You can config app_domain and the rest of github app configs github_app_* in case you need a github app not a personal bot.

Add a new webhook from Settings > Webhooks, Set the Payload URL to be https://hamster.com/listen, Content type as JSON and Add Your Webhook Secret.

And then run the application

$ go build hamster.go
$ ./hamster

// OR

$ go run hamster.go

Also running hamster with docker still an option. Just don't forget to update GithubToken, GithubWebhookSecret, RepositoryAuthor and RepositoryName inside docker-compose.yml file. Then run the following stuff

$ docker-compose build
$ docker-compose up -d

Customize the Default Event Listeners

Anytime github call hamster listen endpoint, there will be a callback that get called with incoming data. For example when you get a status change call from github, the StatusListener(status event.Status) will get called. So do whatever you need inside this callback.

any event: any time listen endpoint get a call, the following callback get called.

// plugin/base.go

// Any Action
func RawListener(raw event.Raw) (bool, error) {
    logger.Info("Raw event listener fired!")
    return true, nil
}

status event: any time a Repository has a status update from the API, The following callback get called.

// plugin/base.go

// Status Action
func StatusListener(status event.Status) (bool, error) {
    logger.Info("Status event listener fired!")
    return true, nil
}

watch event: any time a User stars a Repository.

// plugin/base.go

// Watch Action
func WatchListener(watch event.Watch) (bool, error) {
    logger.Info("Watch event listener fired!")
    return true, nil
}

issues event: any time an Issue is assigned, unassigned, labeled, unlabeled, opened, edited, milestoned, demilestoned, closed, or reopened.

// plugin/base.go

// Issue Action
func IssuesListener(issues event.Issues) (bool, error) {
    logger.Info("Issues event listener fired!")
    return true, nil
}

issue_comment event: any time a comment on an issue is created, edited, or deleted.

// plugin/base.go

// Issue Comment Action
func IssueCommentListener(issueComment event.IssueComment) (bool, error) {
    logger.Info("IssueComment event listener fired!")
    return true, nil
}

push event: Any Git push to a Repository, including editing tags or branches. Commits via API actions that update references are also counted. This is the default event.

// plugin/base.go

// Push Action
func PushListener(push event.Push) (bool, error) {
    logger.Info("Push event listener fired!")
    return true, nil
}

create event: Any time a Branch or Tag is created.

// plugin/base.go

// Create Action
func CreateListener(create event.Create) (bool, error) {
    logger.Info("Create event listener fired!")
    return true, nil
}

label event: Any time a Label is created, edited, or deleted.

// plugin/base.go

// Label Action
func LabelListener(label event.Label) (bool, error) {
    logger.Info("Label event listener fired!")
    return true, nil
}

delete event: Any time a branch or tag is deleted.

// plugin/base.go

// Delete Action
func DeleteListener(delete event.Delete) (bool, error) {
    logger.Info("Delete event listener fired!")
    return true, nil
}

milestone event: Any time a Milestone is created, closed, opened, edited, or deleted.

// plugin/base.go

// Milestone Action
func MilestoneListener(milestone event.Milestone) (bool, error) {
    logger.Info("Milestone event listener fired!")
    return true, nil
}

pull_request event: Any time a pull request is assigned, unassigned, labeled, unlabeled, opened, edited, closed, reopened, or synchronized (updated due to a new push in the branch that the pull request is tracking). Also any time a pull request review is requested, or a review request is removed.

// plugin/base.go

// Pull Request Action
func PullRequestListener(pullRequest event.PullRequest) (bool, error) {
    logger.Info("PullRequest event listener fired!")
    return true, nil
}

pull_request_review event: Any time a pull request review is submitted, edited, or dismissed.

// plugin/base.go

// Pull Request Review Action
func PullRequestReviewListener(pullRequestReview event.PullRequestReview) (bool, error) {
    logger.Info("PullRequestReview event listener fired!")
    return true, nil
}

pull_request_review_comment event: Any time a comment on a pull request's unified diff is created, edited, or deleted (in the Files Changed tab).

// plugin/base.go

// Pull Request Review Comment Action
func PullRequestReviewCommentListener(pullRequestReviewComment event.PullRequestReviewComment) (bool, error) {
    logger.Info("PullRequestReviewComment event listener fired!")
    return true, nil
}

All current supported events and the future events will be available on plugin/base.go. Also it is handy to add aditional callbacks so each event can have any number of callbacks.

Also please check the latest github webhooks guide.

Build Custom Commands

In order to build an interactive bot, you will need to listen to a pre-defined commands that once your repo users type on an issue or a comment, your application get notified. Github don't support this by default but it is still possible to achieve this manually.

First you need to define you command and the callback on internal/app/controller/listener.go, exactly like the test command:

// The default test command for issue comments
commands.RegisterIssueCommentAction("test", plugin.IssueCommentTestCommandListener)

//The new run command for issue comments
commands.RegisterIssueCommentAction("run", plugin.IssueCommentRunCommandListener)
// The default test command for issues
commands.RegisterIssuesAction("test", plugin.IssuesTestCommandListener)

//The new run command for issues
commands.RegisterIssuesAction("run", plugin.IssuesRunCommandListener)

Then define the callbacks on plugin/base.go same as test commands callbacks:

// Test Command Callbacks
// Test Command Listener for Issues
func IssuesTestCommandListener(command event.Command, issues event.Issues) (bool, error) {
    logger.Info("IssuesTestCommandListener event listener fired!")
    return true, nil
}

// Test Command Listener for Issues Comments
func IssueCommentTestCommandListener(command event.Command, issue_comment event.IssueComment) (bool, error) {
    logger.Info("IssueCommentTestCommandListener event listener fired!")
    return true, nil
}

// Run Command Callbacks
// Run Command Listener for Issues
func IssuesRunCommandListener(command event.Command, issues event.Issues) (bool, error) {
    logger.Info("IssuesTestCommandListener event listener fired!")
    return true, nil
}

// Run Command Listener for Issues Comments
func IssueCommentRunCommandListener(command event.Command, issue_comment event.IssueComment) (bool, error) {
    logger.Info("IssueCommentTestCommandListener event listener fired!")
    return true, nil
}

Now if you create a new issue or issue comment, the related callbacks will get notified with command object:

/test
/test{option1}
/test{option1,option2}
/test{option1,option2,option3}

/run
/run{option1}
/run{option1,option2}
/run{option1,option2,option3}

The command object will be

event.Command{Name=test, Parameters=[]}
event.Command{Name=test, Parameters=[option1]}
event.Command{Name=test, Parameters=[option1 option2]}
event.Command{Name=test, Parameters=[option1 option2 option3]}

event.Command{Name=run, Parameters=[]}
event.Command{Name=run, Parameters=[option1]}
event.Command{Name=run, Parameters=[option1 option2]}
event.Command{Name=run, Parameters=[option1 option2 option3]}

Create a Github Comment

// for more info https://developer.github.com/v3/issues/comments/#create-a-comment

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Replace Message with the message and 1 with the issue id
created_comment, err := github_api.NewComment("Message", 1)

if err == nil {
    // created_comment.ID
    // check github.com/clivern/hamster/internal/app/response/created_comment.CreatedComment for available data
}else{
    // err.Error()
}

Create a Label

// for more info https://developer.github.com/v3/issues/labels/#create-a-label

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Get Repository label with name
// github_api.CreateLabel (name string, color string) (response.Label, error)
label, err := github_api.CreateLabel("Bug", "f29513")

if err == nil {
    // label of type response.Label
}else{
    // err.Error()
}

Get a Label

// for more info https://developer.github.com/v3/issues/labels/#get-a-single-label

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Get Repository label with name
// github_api.GetLabel (name string) (response.Label, error)
label, err := github_api.GetLabel("Bug")

if err == nil {
    // label of type response.Label
}else{
    // err.Error()
}

Update a Label with Name

// for more info https://developer.github.com/v3/issues/labels/#update-a-label

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Update label name and color
// github_api.UpdateLabel (currentName string, name string, color string) (response.Label, error)
label, err := github_api.UpdateLabel("CurrentName", "NewName", "b01f26")

if err == nil {
    // label of type response.Label
}else{
    // err.Error()
}

Delete a Label with Name

// for more info https://developer.github.com/v3/issues/labels/#delete-a-label

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Delete label with name
// github_api.DeleteLabel (name string) (bool, error)
ok, err := github_api.DeleteLabel("CurrentName")

if ok && err == nil {
    // label deleted
}else{
    // err.Error()
}

Get Repository Labels List

// for more info https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Get Repository labels
// github_api.GetRepositoryLabels () ([]response.Label, error)
labels, err := github_api.GetRepositoryLabels()

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Get Issue Labels List

// for more info https://developer.github.com/v3/issues/labels/#list-labels-on-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Get Repository issue labels with issue_id
// github_api.GetRepositoryIssueLabels (issueId int) ([]response.Label, error)
labels, err := github_api.GetRepositoryIssueLabels(9)

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Remove Label from an Issue

// for more info https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Remove a Label from an Issue
// github_api.RemoveLabelFromIssue (issueId int, labelName string) (bool, error)
ok, err := github_api.RemoveLabelFromIssue(9, "bug")

if ok && err == nil {
    // Label Removed
}else{
    // err.Error()
}

Remove All Labels from an Issue

// for more info https://developer.github.com/v3/issues/labels/#remove-all-labels-from-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Remove a Label from an Issue
// github_api.RemoveAllLabelForIssue (issueId int) (bool, error)
ok, err := github_api.RemoveAllLabelForIssue(9)

if ok && err == nil {
    // All Labels Removed
}else{
    // err.Error()
}

Get Milestone Labels List

// for more info https://developer.github.com/v3/issues/labels/#get-labels-for-every-issue-in-a-milestone

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Get Milestone Labels List
// github_api.GetRepositoryMilestoneLabels (milestoneId int) ([]response.Label, error)
labels, err := github_api.GetRepositoryMilestoneLabels(9)

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Add Labels to an Issue

// for more info https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Add Labels to an Issue
// github_api.AddLabelsToIssue (issueId int, labels []string) ([]response.Label, error)
labels, err := github_api.AddLabelsToIssue(9, []string{"new-label", "another-label"})

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Replace all Labels for an Issue

// for more info https://developer.github.com/v3/issues/labels/#replace-all-labels-for-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Replace all Labels for an Issue
// github_api.ReplaceAllLabelsForIssue (issueId int, labels []string) ([]response.Label, error)
labels, err := github_api.ReplaceAllLabelsForIssue(9, []string{"new-label", "another-label"})

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Get PR Labels List

// for more info https://developer.github.com/v3/issues/labels/#list-labels-on-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Get Repository PR labels with PRId
// github_api.GetRepositoryPRLabels (PRId int) ([]response.Label, error)
labels, err := github_api.GetRepositoryPRLabels(9)

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Remove Label from PR

// for more info https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Remove a Label from PR
// github_api.RemoveLabelFromPR (PRId int, labelName string) (bool, error)
ok, err := github_api.RemoveLabelFromPR(9, "bug")

if ok && err == nil {
    // Label Removed
}else{
    // err.Error()
}

Remove All Labels from PR

// for more info https://developer.github.com/v3/issues/labels/#remove-all-labels-from-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Remove a Label from PR
// github_api.RemoveAllLabelForPR (PRId int) (bool, error)
ok, err := github_api.RemoveAllLabelForPR(9)

if ok && err == nil {
    // All Labels Removed
}else{
    // err.Error()
}

Add Labels to PR

// for more info https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Add Labels to PR
// github_api.AddLabelsToPR (PRId int, labels []string) ([]response.Label, error)
labels, err := github_api.AddLabelsToPR(9, []string{"new-label", "another-label"})

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Replace all Labels for PR

// for more info https://developer.github.com/v3/issues/labels/#replace-all-labels-for-an-issue

import (
    "github.com/clivern/hamster/internal/app/pkg/github"
    "os"
)


github_api := &github.API{
    Token: os.Getenv("GithubToken"),
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// Replace all Labels for PR
// github_api.ReplaceAllLabelsForPR (PRId int, labels []string) ([]response.Label, error)
labels, err := github_api.ReplaceAllLabelsForPR(9, []string{"new-label", "another-label"})

if err == nil {
    // labels of type []response.Label
}else{
    // err.Error()
}

Authorizing OAuth Apps

You can enable other users to authorize your OAuth App. First configure the app credentials on config.dist.json or docker-compose.yml

// config.dist.json
    "app_domain": "example.com",
    "github_app_client_id": "..",
    "github_app_redirect_uri": "..",
    "github_app_allow_signup": "false",
    "github_app_scope": "", // It can be empty
    "github_app_client_secret": ".."
// docker-compose.yml
     - GithubAppClientID=ValueHere
     - GithubAppRedirectURI=ValueHere
     - GithubAppAllowSignup=true
     - GithubAppScope= // It can be empty
     - GithubAppClientSecret=ValueHere
     - AppDomain=example.com

The github app should configured to use http://example.com/auth as redirect URL.

If you run the application, the authorize URL on /login page should be something like that:

https://github.com/login/oauth/authorize?allow_signup=true&client_id=Iv1.eda..&redirect_uri=https%3A%2F%2F3fa8b997.ngrok.io%2Fauth&scope=&state=5a0a8c973e93ed82820f7896dddb1df70a3dce62

If you click authorize and authorized the app, github will send you back to hamster /auth route with a code and the state. Hamster will use that code to fetch the accessToken for you or any user. You can use the accessToken to do all subsequent github API Calls.

Github Check Runs

To create a status check:

import (
    "github.com/clivern/hamster/internal/app/response"
    "github.com/clivern/hamster/internal/app/sender"
    "github.com/clivern/hamster/internal/app/pkg/github"

    "os"
    "time"
    "fmt"
)

output := sender.Output{
    Title: "CI Report",
    Summary: "Output Summary",
    Text: "Some Text Goes Here",
}

checkRun := sender.CheckRun{
    Name: "CI Status",
    HeadSha: "6c46684560f9fed86be6fd87f9dbaa91e4b242c9",
    Status: "in_progress",
    DetailsURL: "http://clivern.com/ci/5",
    ExternalID: "43",
    StartedAt: time.Now().UTC().Format(time.RFC3339),
    Output: output,
}

var checkRunResponse response.CheckRun

github_api := &github.API{
    Token: "5688665c9184800e...", # Token via a GitHub App.
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// method CreateCheckRun(CheckRun sender.CheckRun) (response.CheckRun, error)
checkRunResponse, err := github_api.CreateCheckRun(checkRun)

if err == nil{
    fmt.Println(checkRunResponse.ID)
}else{
    fmt.Println(err.Error())
}

To update a status check:

import (
    "github.com/clivern/hamster/internal/app/response"
    "github.com/clivern/hamster/internal/app/sender"
    "github.com/clivern/hamster/internal/app/pkg/github"

    "os"
    "time"
    "fmt"
)

output := sender.Output{
    Title: "CI Report",
    Summary: "Final Output Summary",
    Text: "Some Final Text Goes Here",
}

checkRun := sender.CheckRun{
    Name: "CI Status",
    HeadSha: "6c46684560f9fed86be6fd87f9dbaa91e4b242c9",
    Status: "completed",
    DetailsURL: "http://clivern.com/ci/5",
    ExternalID: "43",
    CompletedAt: time.Now().UTC().Format(time.RFC3339),
    Conclusion: "success",
    Output: output,
}

var checkRunResponse response.CheckRun

github_api := &github.API{
    Token: "5688665c9184800e...", // Token via a GitHub App.
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

// method UpdateCheckRun(ID int, CheckRun sender.CheckRun) (response.CheckRun, error)
checkRunResponse, err := github_api.UpdateCheckRun(25165135, checkRun)

if err == nil{
    fmt.Println(checkRunResponse.ID)
}else{
    fmt.Println(err.Error())
}

To get a status check with ID:

import (
    "github.com/clivern/hamster/internal/app/response"
    "github.com/clivern/hamster/internal/app/pkg/github"

    "os"
    "fmt"
)

var checkRunResponse response.CheckRun

github_api := &github.API{
    Token: "5688665c9184800e...", // Token via a GitHub App.
    Author: os.Getenv("RepositoryAuthor"),
    Repository: os.Getenv("RepositoryName"),
}

checkRunResponse, err := github_api.GetCheckRun(25165135)

if err == nil{
    fmt.Println(checkRunResponse.ID)
}else{
    fmt.Println(err.Error())
}

Logging

We use google/logger under the hood, make use of it or use these simple functions:

import (
    "github.com/clivern/hamster/internal/app/pkg/logger"
)

logger.Info("Info Goes Here!")
logger.Infoln("Infoln Goes Here!")
logger.Infof("Infof %s Here!", "Goes")

logger.Warning("Warning Goes Here!")
logger.Warningln("Warningln Goes Here!")
logger.Warningf("Warningf %s Here!", "Goes")

logger.Error("Error Goes Here!")
logger.Errorln("Errorln Goes Here!")
logger.Errorf("Errorf %s Here!", "Goes")

logger.Fatal("Fatal Goes Here!")
logger.Fatalln("Fatalln Goes Here!")
logger.Fatalf("Fatalf %s Here!", "Goes")

Badges

Build Status GitHub license Version Go Report Card

Changelog

  • Version 3.1.0:
Switch to go 1.11 modules.
  • Version 3.0.1:
Fix ineffassign for some vars.
  • Version 3.0.0:
More Enhancements.
  • Version 2.0.0:
Add More Events.
Add Labels & Comments API to Github pkg.
Custom Commands.
OAuth Apps Support.
Check Runs Support.
  • Version 1.1.1:
Add Logger Package.
  • Version 1.1.0:
Add new events watch, issues and issue_comment.
Fix dockerfile & docker-compose.
  • Version 1.0.0:
Initial Release.

Acknowledgements

ยฉ 2018, Clivern. Released under MIT License.

Hamster is authored and maintained by @clivern.

More Repositories

1

Beaver

๐Ÿ’จ A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps.
Go
1,439
star
2

Peanut

๐Ÿบ Deploy Databases and Services Easily for Development and Testing Pipelines.
Go
698
star
3

Walrus

๐Ÿ”ฅ Fast, Secure and Reliable System Backup, Set up in Minutes.
Go
458
star
4

Gauntlet

๐Ÿ”– Guides, Articles, Podcasts, Videos and Notes to Build Reliable Large-Scale Distributed Systems.
430
star
5

Rabbit

โšก๏ธ A lightweight service that will build and store your go projects binaries, Integrated with Github, Gitlab, Bitbucket and Bitbucket Server.
Go
197
star
6

Beetle

๐Ÿ”ฅ Kubernetes multi-cluster deployment automation service.
Go
163
star
7

Hippo

๐Ÿ’จA well crafted go packages that help you build robust, reliable, maintainable microservices.
Go
143
star
8

Poodle

๐Ÿ”ฅ A fast and beautiful command line tool to build API requests.
Go
135
star
9

Cattle

๐Ÿบ Platform to Run and Share Code. It Supports PHP, Python, Ruby, Elixir, Java, Go, Rust, C and C++.
Python
60
star
10

Buzzard

๐Ÿฆ€ Learning Rust by Examples.
Rust
57
star
11

Chunk

๐Ÿบ Asynchronous Task Queue Based on Distributed Message Passing for PHP.
PHP
36
star
12

Rhino

โ„๏ธ HTTP Mocking & Debugging Service.
Go
31
star
13

Imap

๐Ÿ“ฌ Access Mailbox Using PHP IMAP.
PHP
29
star
14

Racter

๐ŸŠ A Java Framework for Building Bots on Facebook's Messenger Platform.
Java
18
star
15

terraform-provider-boilerplate

๐Ÿ„Terraform Provider Boilerplate.
Go
17
star
16

Cluster

Golang Package for System Clustering.
Go
15
star
17

Laravel-CSV-Export

๐Ÿ”Ž Export a Large Dataset in CSV Format.
PHP
13
star
18

PyLogging

๐Ÿ‰ Python Logging Library
Python
12
star
19

file_uploader

๐Ÿ—ฟ PHP File Uploader Package
PHP
12
star
20

Chaos

๐Ÿบ A Server Chaos Maker, Set up in Minutes.
Go
11
star
21

wit-java

๐Ÿ—ฟJava Library For Wit.ai
Java
11
star
22

generator-goapi

๐Ÿ™ Yeoman Generator for Golang Microservices.
Go
6
star
23

Observability-php-sdk

๐Ÿบ Observability SDK for PHP Applications.
PHP
6
star
24

Bull

๐Ÿ“ฆMicroservices Playground with Symfony 4.
PHP
5
star
25

Apes

๐Ÿ’จChaos and Resiliency Testing Service.
Go
5
star
26

ghbot

๐Ÿค– Github Follow Bot in Python.
Python
5
star
27

Kraven

๐Ÿ’ฎ A SaaS docker management dashboard to manage your docker containers, images, volumes, networks and much more!
Python
5
star
28

Pindo

๐Ÿบ Securely Build and Run Code in Docker.
Python
5
star
29

arduino_exporter

๐Ÿบ Arduino Prometheus Exporter.
Python
4
star
30

Mammal

๐Ÿบ A Sample Microservice.
Go
3
star
31

PyArchiver

Python Compression and Archiving Library
Python
3
star
32

Glove

๐Ÿบ Prometheus Exporter Boilerplate.
Go
3
star
33

Kevin

๐Ÿบ Web Application to Inspect HTTP Requests & Build Custom Endpoints.
Python
3
star
34

Bucket

Consistent Hashing Algorithm Package for Scalable Data Distribution
Java
3
star
35

pushover-actions

๐Ÿงฌ Push notifications for github repository changes through pushover.
Go
3
star
36

Jarvis

๐Ÿ‘ปThe Hitchhiker's Guide To Go Language
Go
3
star
37

Redis-PubSub

Build Realtime Apps With Redis PubSub
HTML
2
star
38

Koala

๐Ÿงฌ Kubernetes Playground for Testing Purposes.
Go
2
star
39

Snippets

๐Ÿซ Sublime Text Snippets.
Shell
2
star
40

Toad

โ„๏ธ Containerized Application for Testing Purposes.
Go
2
star
41

MongoPlaybook

๐Ÿ“š It's worth to give it a try
2
star
42

generator-gopkg

๐Ÿ™ Yeoman Generator for Golang Packages.
JavaScript
2
star
43

Memcached

Memcached Client for PHP.
PHP
2
star
44

Monkey

๐Ÿต Apache CloudStack SDK in PHP that supports sync calls, async calls and multiple dependent calls.
PHP
2
star
45

fast-yt-videos

A WordPress Plugin That Increase Youtube Videos Loading Time
PHP
2
star
46

Walnut

๐Ÿ“ง Async Transactional Email Service.
PHP
1
star
47

Dunk

How to Create a Facebook Messenger Bot With Java
Java
1
star
48

Mantis

A Minimalist ORM for Python
Python
1
star
49

Beagle

Symfony Applications Boilerplate.
PHP
1
star
50

Thanos

๐Ÿ”ฅ53 77 69 73 73 20 4b 6e 69 66 65 21
Python
1
star
51

Events

ES tryout with Symfony 5
PHP
1
star
52

Kemet

My dotfiles.
Shell
1
star
53

PyHusky

๐Ÿบ Python Role Based Permissions Library.
Python
1
star
54

Weasel

๐Ÿบ Modern Command Line Tool for Apache Kafka.
Go
1
star
55

Oxygen

๐Ÿบ Ansible Collection to Deploy A Reliable PHP Services.
Jinja
1
star
56

Polars

A Ruby SDK for Different Linux Operating System Distributions.
Ruby
1
star
57

Fred

๐Ÿ‰ A Java Framework for Building Slack Bots.
Java
1
star
58

Trent

Experimental Chatbots With Java & Play Framework
Java
1
star
59

beaver.js

A JavaScript client for beaver, the real time messaging system.
TypeScript
1
star
60

LWT

๐Ÿบ Simple ERP Application Skeleton In Symfony 3.3.9.
PHP
1
star
61

Bear

A WordPress Themes Boilerplate.
PHP
1
star
62

Minion

Single Page Application Boilerplate.
TypeScript
1
star
63

Kevin-Cookbook

๐Ÿ™A Chef Cookbook To Deploy Kevin on Linux Servers.
Ruby
1
star
64

Frog

๐Ÿธ A Java Framework for Social Sign In.
Java
1
star
65

terraform-provider-beetle

๐Ÿ”ฅ Beetle Terraform Provider.
Go
1
star
66

Alligator

๐ŸŠ Golang Package Boilerplate.
Makefile
1
star