how it fits together.
every tool is a single Go binary with a Bubble Tea TUI. no runtime dependencies, no Docker, no databases, no environment variables. download it, run it, done. Homebrew is available for convenience but not required.
data stays on the user’s machine. local storage is files on disk, encrypted at rest with AES-256-GCM and Argon2id key derivation. nothing phones home. nothing syncs to someone else’s server.
each tool is its own repository under zarlcorp/, importing shared packages from zarlcorp/core. tools stay independent. core never depends on tools. when a tool builds something genuinely reusable, it gets extracted into core.
zarlcorp/core is the shared foundation. every package under pkg/ is an independent Go module with its own go.mod, versioned and released separately.
┌─────────────────────────────────────────────┐
│ zapp │ lifecycle
├──────────────┬──────────────────────────────┤
│ zstyle │ zcrypto │ presentation + security
├──────────────┴──────────────────────────────┤
│ zcache · zfilesystem │ data + storage
├─────────────────────────────────────────────┤
│ zsync · zoptions │ foundation
└─────────────────────────────────────────────┘
dependencies flow downward only. foundation packages depend on nothing but the standard library.
zarlcorp/<tool>/
├── cmd/<tool>/ # entrypoint
│ └── main.go
├── internal/ # tool-specific logic
│ ├── tui/ # Bubble Tea models
│ └── ...
├── go.mod # depends on core/pkg/*
├── Makefile
├── LICENSE
└── README.md
import "github.com/zarlcorp/core/pkg/zapp"
import "github.com/zarlcorp/core/pkg/zcrypto"
import "github.com/zarlcorp/core/pkg/zstyle"
each package is imported individually. a tool pulls in only what it needs. the go.work file coordinates local development across modules.
each tool follows the same release flow:
zarlcorp/homebrew-tap)brew install zarlcorp/tap/<tool> works immediatelyreusable CI workflows live in zarlcorp/.github — individual tool repos reference them, not copy them.