# Hostkeeper V2 — Build System > **Status**: Updated untuk HTMX > **Last Updated**: 2026-07-07 > **Frontend**: Go HTML template + HTMX + TailwindCSS v4 (tanpa Vite/npm/React) --- ## 1. Build Overview Hostkeeper V2 adalah **single Go binary** yang melayani HTML + static files. | Platform | Output | Wrapper | Backend | |----------|--------|---------|---------| | macOS (ARM64) | `.dmg` | Electron (opsional) | Go binary | | macOS (x64) | `.dmg` | Electron (opsional) | Go binary | | Windows (x64) | `.exe` installer | Electron (opsional) | Go binary | | Linux (x64) | `.AppImage` | Electron (opsional) | Go binary | | Android (ARM64) | `.aab` | WebView | Go library (.aar) | | iOS (ARM64) | `.ipa` | WKWebView | Go framework (.xcframework) | **Catatan**: Tanpa Electron app tetap bisa jalan — tinggal buka `http://localhost:1947` di browser. --- ## 2. Build Pipeline ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ TailwindCSS │ │ Go Build │ │ Platform │ │ Build │ → │ (single │ → │ Package │ │ (CSS) │ │ binary) │ │ (opsional) │ └──────────────┘ └──────────────┘ └──────────────┘ ``` ### Step 1: CSS Build ```bash # TailwindCSS v4 — input.css → output.css npx @tailwindcss/cli -i static/css/input.css -o static/css/output.css # Atau via Makefile make css ``` ### Step 2: Go Build ```bash # Development (hot reload via air) go run . # Production (single binary with embedded static) CGO_ENABLED=0 go build -ldflags="-s -w" -o dist/hostkeeper . # Cross-compile CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o dist/hostkeeper-darwin-arm64 . CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o dist/hostkeeper-linux-amd64 . CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o dist/hostkeeper-windows-amd64.exe . ``` ### Step 3: Elektron Package (Opsional) ```bash cd app/electron npm install npm run build # produces .dmg / .exe / .AppImage ``` --- ## 3. Development Workflow ```bash # Terminal 1: Go backend (dengan hot reload) cd app/backend go run . # Terminal 2: CSS watch cd app/backend npx @tailwindcss/cli -i static/css/input.css -o static/css/output.css --watch # Buka browser open http://localhost:1947 ``` ### Hot Reload Tools ```bash # Install air go install github.com/air-verse/air@latest # Run air ``` --- ## 4. Struktur Build Output ``` dist/ ├── hostkeeper ← Go binary (single file) ├── static/ ← Embedded static assets │ ├── css/ │ ├── js/ │ ├── xterm/ │ └── img/ └── views/ ← Embedded HTML templates ├── layout.html └── partials/ ``` GoFiber `embed` package untuk embed static + views: ```go //go:embed static/* views/* var embedFS embed.FS func main() { app := fiber.New() app.Static("/static", "./static") engine := html.NewFileSystem(http.FS(embedFS), ".html") app.Settings.Views = engine } ``` --- ## 5. Dependencies ### Go ``` github.com/gofiber/fiber/v2 github.com/gofiber/contrib/websocket github.com/gofiber/template/html/v2 github.com/fasthttp/websocket ``` ### JavaScript (static files — download, bukan npm) ``` static/js/htmx.min.js ← https://unpkg.com/htmx.org@2 static/js/alpine.min.js ← https://cdn.jsdelivr.net/npm/alpinejs@3 static/xterm/xterm.js ← https://unpkg.com/@xterm/xterm static/xterm/xterm.css ← https://unpkg.com/@xterm/xterm/css ``` ### CSS Tooling ``` @tailwindcss/cli ← npx, build time only ``` --- ## 6. Makefile ```makefile .PHONY: dev build css clean dev: @echo "Starting dev server..." @go run . css: npx @tailwindcss/cli -i static/css/input.css -o static/css/output.css css-watch: npx @tailwindcss/cli -i static/css/input.css -o static/css/output.css --watch build: CGO_ENABLED=0 go build -ldflags="-s -w" -o dist/hostkeeper . build-all: GOOS=darwin GOARCH=arm64 go build -o dist/hostkeeper-darwin-arm64 . GOOS=darwin GOARCH=amd64 go build -o dist/hostkeeper-darwin-amd64 . GOOS=linux GOARCH=amd64 go build -o dist/hostkeeper-linux-amd64 . GOOS=windows GOARCH=amd64 go build -o dist/hostkeeper-windows-amd64.exe . clean: rm -rf dist/ ```