Hà Nội, Việt Nam · on GitHub since 2014

Cuong Giang

Software writer.

I write tools for developers: keyboard-driven terminal apps in Go, a Go web framework for Inertia.js, and packages for Laravel and Rails. All of it is open source, and nearly all of it installs with one command.

This page works like omassh: j k to move, enter to open, ? for every key.

Selected work

2024 – 2026

01gossh client2026

omassh on GitHub

A keyboard-driven SSH client for the terminal: Termius’s data model, lazygit’s interaction model, running on top of real OpenSSH.

Keep hosts in groups that share a user, a key and a jump host. Connect with a keystroke, full screen or in a pane beside the list. Browse files, keep tunnels up after you quit, and run a script across a whole group — all through the ssh already on your machine.

brew install --cask cuonggt/tap/omassh
Every connection is your own ssh, so ~/.ssh/config, ProxyJump and the agent apply exactly as they do on the command line.

02goweb framework2026early

tug on GitHub

A web framework for Go apps whose frontend is Inertia.js: React pages rendered with props straight from Go handlers, no API in between, and the whole app shipped as one binary.

Background jobs on a schedule, server-side rendering, uploads on disk or in S3, mail, events broadcast to every open page, and starters in React, Vue or Svelte — one of them with accounts, passkeys and two-factor logins.

The name: a tugboat is small, and moves ships many times its size.

go install github.com/cuonggt/tug/cmd/tug@latest

posts.go

type PostsIndexProps struct {
    Posts []Post                   `json:"posts"`
    Stats inertia.DeferProp[Stats] `json:"stats"`
}

var PostsIndex = tug.Page[PostsIndexProps]("Posts/Index")

func index(c *tug.Ctx) error {
    return PostsIndex.Render(c, PostsIndexProps{
        Posts: store.List(),
        // fetched after the page shows
        Stats: inertia.Defer(store.Count),
    })
}

terminal

# a new app, in ./blog
$ tug new blog
$ cd blog

# http://localhost:8080, rebuilt
# and reloaded as it changes
$ tug dev
A page and the handler that renders it. The props go straight to a React page in resources/js/pages/Posts/Index.tsx.

03goserver console2026

rove on GitHub

A terminal console for the Linux servers you already reach over SSH. If ssh server works, rove works.

It reads ~/.ssh/config and never asks for a private key. See every server at once, then find what’s wrong — processes and their containers, disks, services, listeners — without remembering the Linux commands for each.

brew install --cask cuonggt/tap/rove
Six hosts, three that need attention. enter opens one; s drops into ssh and comes back when you exit.

04shellmacos setup2024

omakma on GitHub

An opinionated setup for macOS, heavily inspired by Omakub. One command turns a fresh Mac into a fully configured, modern web development system.

Ghostty, Alacritty and iTerm2; Neovim with LazyVim; tmux and Zellij; lazygit, fzf, ripgrep, bat, eza and zoxide; Node, Go, Python, Ruby, PHP and Rust; MySQL, PostgreSQL and Redis if you want them. Afterwards, omakma opens a menu for themes, fonts and the rest.

bash < <(curl -sL https://raw.githubusercontent.com/cuonggt/omakma/master/boot.sh)
Preview an omakma theme
Seven themes, switched together across Alacritty, Ghostty, Zellij, Neovim, VS Code and Sublime Text. The colours are omakma’s own; Default is Tokyo Night.

More projects

Laravel, Rails, Go

laravel-dibi

An elegant GUI database management tool for your Laravel applications. Browse the database on a local or dev server at /dibi, without installing another app.

composer require cuonggt/laravel-dibi

phpvue2018

Dibi showing the rows of a users table, with a raw SQL filter above the grid and the list of tables on the left.

bosun

Provision servers and deploy Laravel applications with zero downtime, straight from artisan.

  • setup
  • deploy
  • rollback
  • secure
  • status
  • logs
  • ssh
composer require cuonggt/bosun

phplaravel2026

envoy-cli

Run the tasks you run on your remote servers, deploys and the rest, from a YAML Envoyfile and a single binary.

gocli2023

zzh

An SSH client and connection manager for your favourite terminal. It stores your hosts and credentials, so you don’t have to remember them.

gocli2019

hooky

Git hooks for PHP, heavily inspired by husky: lint commit messages, lint code and run tests when you commit or push.

composer require --dev cuonggt/hooky

phpcomposer2023

reji-stripe

An expressive, fluent interface to Stripe’s subscription billing services for your Rails applications.

rubygem2020

binance-connector-php

A simple connector to the Binance public API: market data, trading and websockets, from PHP.

phplibrary2022

Earlier

2016 – 2019

About

I’m Cuong Giang, a software developer in Hà Nội. I’ve kept my work on GitHub since 2014 and have published open source since 2016: Ruby gems for Rails at first, then Laravel packages, and lately mostly Go.

A lot of what I build carries a good idea somewhere new. Stripe billing in the style of Laravel Cashier, for Rails. Laravel’s Envoy, as one Go binary. husky’s git hooks, for PHP. Omakub’s opinions, for the Mac. Inertia.js, for Go.

The rest lives between a laptop and a server: SSH clients, deploy tools, and a console for a fleet of Linux machines.

Based in
Hà Nội, Việt Nam
On GitHub
since 2014
Open source
since 2016
Writes
Go, PHP, Ruby, JavaScript, Shell
Setup
omakma
Elsewhere
GitHub · X · Gists

Keyboard

j k
Next and previous project
enter o
Open the selected project
y
Copy its install command
g G
Top and bottom of the page
t
Light or dark theme
?
This list
esc
Close, or clear the selection

Turn them off if they get in the way of a screen reader or voice control. The buttons in the header always work.