🌷 the cutsie hackatime helper

feat: add basic command and flake

dunkirk.sh 0322f9ff 88ea8f48

verified
+3
.gitignore
···
+
bin
+
.direnv
+
.envrc
+32
README.md
···
The cutsie [hackatime](https://hackatime.hackclub.com/) helper. Helping solve common problems since `2025`
+
## Install
+
+
You can download a pre-built binary from the releases or you can use the following options
+
+
### Go
+
+
```bash
+
# Go
+
go install github.com/taciturnaxolotl/akami@latest
+
```
+
+
### Nix
+
+
```bash
+
# Direct installation with flakes enabled
+
nix profile install github:taciturnaxolotl/akami
+
```
+
+
For use in your own flake:
+
+
```nix
+
# In your flake.nix
+
{
+
inputs.akami.url = "github:taciturnaxolotl/akami";
+
+
outputs = { self, nixpkgs, akami, ... }: {
+
# Access the package as:
+
# akami.packages.${system}.default
+
};
+
}
+
```
+
Written in go with [fang](https://github.com/charmbracelet/fang) and [cobra](https://github.com/spf13/cobra). If you have any suggestions or issues feel free to open an issue on my [tangled](https://tangled.sh/@dunkirk.sh/akami) knot
<p align="center">
+27
flake.lock
···
+
{
+
"nodes": {
+
"nixpkgs": {
+
"locked": {
+
"lastModified": 1750365781,
+
"narHash": "sha256-XE/lFNhz5lsriMm/yjXkvSZz5DfvKJLUjsS6pP8EC50=",
+
"owner": "NixOS",
+
"repo": "nixpkgs",
+
"rev": "08f22084e6085d19bcfb4be30d1ca76ecb96fe54",
+
"type": "github"
+
},
+
"original": {
+
"owner": "NixOS",
+
"ref": "nixos-unstable",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
+
"root": {
+
"inputs": {
+
"nixpkgs": "nixpkgs"
+
}
+
}
+
},
+
"root": "root",
+
"version": 7
+
}
+65
flake.nix
···
+
{
+
description = "🌷 the cutsie hackatime helper";
+
+
inputs = {
+
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+
};
+
+
outputs = { self, nixpkgs }:
+
let
+
allSystems = [
+
"x86_64-linux" # 64-bit Intel/AMD Linux
+
"aarch64-linux" # 64-bit ARM Linux
+
"x86_64-darwin" # 64-bit Intel macOS
+
"aarch64-darwin" # 64-bit ARM macOS
+
];
+
forAllSystems = f: nixpkgs.lib.genAttrs allSystems (system: f {
+
pkgs = import nixpkgs { inherit system; };
+
});
+
in
+
{
+
packages = forAllSystems ({ pkgs }: {
+
default = pkgs.buildGoModule rec {
+
pname = "akami";
+
version = "0.0.1";
+
subPackages = [ "." ]; # Build from root directory
+
src = ./.;
+
vendorHash = "sha256-9gO00c3D846SJl5dbtfj0qasmONLNxU/7V1TG6QEaxM=";
+
};
+
});
+
+
devShells = forAllSystems ({ pkgs }: {
+
default = pkgs.mkShell {
+
buildInputs = with pkgs; [
+
go
+
gopls
+
gotools
+
go-tools
+
(pkgs.writeShellScriptBin "akami-dev" ''
+
go build -o ./bin/akami ./main.go
+
./bin/akami "$@" || true
+
'')
+
];
+
+
shellHook = ''
+
export PATH=$PATH:$PWD/bin
+
mkdir -p $PWD/bin
+
'';
+
};
+
});
+
+
apps = forAllSystems ({ pkgs }: {
+
default = {
+
type = "app";
+
program = "${self.packages.${pkgs.system}.default}/bin/akami";
+
};
+
akami-dev = {
+
type = "app";
+
program = toString (pkgs.writeShellScript "akami-dev" ''
+
go build -o ./bin/akami ./main.go
+
./bin/akami $* || true
+
'');
+
};
+
});
+
};
+
}
+27
go.mod
···
+
module github.com/taciturnaxolotl/akami
+
+
go 1.24.3
+
+
require (
+
github.com/charmbracelet/colorprofile v0.3.0 // indirect
+
github.com/charmbracelet/fang v0.1.0 // indirect
+
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1 // indirect
+
github.com/charmbracelet/x/ansi v0.8.0 // indirect
+
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
+
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 // indirect
+
github.com/charmbracelet/x/term v0.2.1 // indirect
+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
+
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
+
github.com/mattn/go-runewidth v0.0.16 // indirect
+
github.com/muesli/cancelreader v0.2.2 // indirect
+
github.com/muesli/mango v0.1.0 // indirect
+
github.com/muesli/mango-cobra v1.2.0 // indirect
+
github.com/muesli/mango-pflag v0.1.0 // indirect
+
github.com/muesli/roff v0.1.0 // indirect
+
github.com/rivo/uniseg v0.4.7 // indirect
+
github.com/spf13/cobra v1.9.1 // indirect
+
github.com/spf13/pflag v1.0.6 // indirect
+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
+
golang.org/x/sys v0.31.0 // indirect
+
golang.org/x/text v0.24.0 // indirect
+
)
+47
go.sum
···
+
github.com/charmbracelet/colorprofile v0.3.0 h1:KtLh9uuu1RCt+Hml4s6Hz+kB1PfV3wi++1h5ia65yKQ=
+
github.com/charmbracelet/colorprofile v0.3.0/go.mod h1:oHJ340RS2nmG1zRGPmhJKJ/jf4FPNNk0P39/wBPA1G0=
+
github.com/charmbracelet/fang v0.1.0 h1:SlZS2crf3/zQh7Mr4+W+7QR1k+L08rrPX5rm5z3d7Wg=
+
github.com/charmbracelet/fang v0.1.0/go.mod h1:Zl/zeUQ8EtQuGyiV0ZKZlZPDowKRTzu8s/367EpN/fc=
+
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1 h1:D9AJJuYTN5pvz6mpIGO1ijLKpfTYSHOtKGgwoTQ4Gog=
+
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc=
+
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
+
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
+
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
+
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
+
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 h1:IJDiTgVE56gkAGfq0lBEloWgkXMk4hl/bmuPoicI4R0=
+
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
+
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
+
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
+
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
+
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
+
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
+
github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI=
+
github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4=
+
github.com/muesli/mango-cobra v1.2.0 h1:DQvjzAM0PMZr85Iv9LIMaYISpTOliMEg+uMFtNbYvWg=
+
github.com/muesli/mango-cobra v1.2.0/go.mod h1:vMJL54QytZAJhCT13LPVDfkvCUJ5/4jNUKF/8NC2UjA=
+
github.com/muesli/mango-pflag v0.1.0 h1:UADqbYgpUyRoBja3g6LUL+3LErjpsOwaC9ywvBWe7Sg=
+
github.com/muesli/mango-pflag v0.1.0/go.mod h1:YEQomTxaCUp8PrbhFh10UfbhbQrM/xJ4i2PB8VTLLW0=
+
github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8=
+
github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig=
+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
+
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
+
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
+
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+19
main.go
···
+
package main
+
+
import (
+
"context"
+
"os"
+
+
"github.com/charmbracelet/fang"
+
"github.com/spf13/cobra"
+
)
+
+
func main() {
+
cmd := &cobra.Command{
+
Use: "akami",
+
Short: "🌷 the cutsie hackatime helper",
+
}
+
if err := fang.Execute(context.TODO(), cmd); err != nil {
+
os.Exit(1)
+
}
+
}