A modern, interactive CLI tool for scaffolding full-stack web applications with a Vite + React + TypeScript frontend and a Go backend. Generate production-ready projects in seconds with your choice of backend frameworks, databases, and UI libraries.
██████╗ ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗██╗ ██╗
██╔════╝ ██╔═══██╗██╔════╝██╔═══██╗╚══███╔╝╚██╗ ██╔╝╚██╗ ██╔╝
██║ ███╗██║ ██║██║ ██║ ██║ ███╔╝ ╚████╔╝ ╚████╔╝
██║ ██║██║ ██║██║ ██║ ██║ ███╔╝ ╚██╔╝ ╚██╔╝
╚██████╔╝╚██████╔╝╚██████╗╚██████╔╝███████╗ ██║ ██║
╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝
- 3 Framework Choices:
- Standard Library - Go
net/httppackage (zero dependencies) - Chi - Lightweight, idiomatic HTTP router
- Gin - High-performance web framework with rich middleware
- Standard Library - Go
- PostgreSQL - Production-ready with
pgx/v5driver and Docker support - SQLite - Embedded database with
go-sqlite3driver - None - Start without a database and add it later
- Vite - Lightning-fast build tool with HMR
- React 18+ - Modern React with TypeScript
- Tailwind CSS v4 - Latest version with Vite plugin
- Bun - Ultra-fast JavaScript runtime and package manager
- shadcn/ui (optional) - Beautiful, accessible component library built on Radix UI
- Interactive TUI - Beautiful terminal wizard powered by Bubble Tea
- Hot Reload - Air configuration for backend auto-restart
- Docker Ready - Multi-stage Dockerfile and docker-compose setup
- TypeScript - Full type safety with path aliases (
@/imports) - Makefile - Common development tasks preconfigured
- Environment Config - Sensible defaults in
.envfile
Requires Go 1.23 or higher:
go install github.com/cozyydev/gocozyy@latestMake sure your $GOPATH/bin is in your PATH:
export PATH=$PATH:$(go env GOPATH)/binClone the repository and build:
git clone https://github.com/cozyydev/gocozyy.git
cd gocozyy
make build
sudo mv ./main /usr/local/bin/gocozyyOr use it directly:
go run main.go creategocozyy --helpCreate your first project in 3 steps:
# 1. Start the interactive wizard
gocozyy create
# 2. Follow the prompts to configure your project
# (See Interactive Wizard Guide below)
# 3. Start developing!
cd my-awesome-project
make docker-run # (if using Docker + PostgreSQL)
make watch # Start backend with hot-reload
cd frontend && bun dev # Start React frontendYour backend will run on http://localhost:8080 and frontend on http://localhost:5173.
The CLI features a beautiful, keyboard-driven wizard that walks you through project setup:
╭────────────────────────────────────────────────────────────────╮
│ Enter your project name: │
│ ▸ my-awesome-project │
│ │
│ [Enter to continue • q to quit] │
╰────────────────────────────────────────────────────────────────╯
Enter your desired project name (lowercase, hyphens recommended).
Controls: Enter to continue, q to quit
╭────────────────────────────────────────────────────────────────╮
│ Select your Go backend framework: │
│ │
│ ○ Standard-library │
│ ● Chi │
│ ○ Gin │
│ │
│ [↑/↓ to navigate • space to select • y to confirm] │
╰────────────────────────────────────────────────────────────────╯
Choose your preferred backend framework:
| Framework | Description | Best For |
|---|---|---|
| Standard Library | Go net/http with http.NewServeMux() |
Simple APIs, learning Go, minimal dependencies |
| Chi | Lightweight, idiomatic router built on stdlib concepts | RESTful APIs, middleware-heavy apps, Go purists |
| Gin | High-performance framework with rich ecosystem | Complex apps, need for speed, comprehensive middleware |
All frameworks come preconfigured with a /api/health endpoint returning {"status":"ok"}.
Controls: ↑/↓ to navigate, space to select, y to confirm
╭────────────────────────────────────────────────────────────────╮
│ Choose your database driver: │
│ │
│ ○ None │
│ ● Postgres │
│ ○ SQLite │
│ │
│ [↑/↓ to navigate • space to select • y to confirm] │
╰────────────────────────────────────────────────────────────────╯
Select your database option:
- No database driver or configuration
- Perfect for API gateways, static content servers, or projects that will use external services
- Add a database later as needed
- Driver:
github.com/jackc/pgx/v5/stdlib - Docker Support: Includes
docker-compose.ymlwith PostgreSQL service - Connection: Configured via environment variables in
.env - Production Ready: Health checks, volume persistence, optimized settings
- Generated File:
backend/internal/database/database.gowithNewPostgres()function
Default PostgreSQL Configuration (.env):
GOCOZYY_DB_HOST=localhost
GOCOZYY_DB_PORT=5432
GOCOZYY_DB_DATABASE=gocozyy
GOCOZYY_DB_USERNAME=sammy
GOCOZYY_DB_PW=supersecretpassword
GOCOZYY_DB_SCHEMA=public- Driver:
github.com/mattn/go-sqlite3 - Embedded: No external database server required
- Lightweight: Perfect for development, small apps, or edge deployments
- Generated File:
backend/internal/database/database.gowithNewSQLite(path string)function
Controls: ↑/↓ to navigate, space to select, y to confirm
╭────────────────────────────────────────────────────────────────╮
│ Do you want Docker/docker-compose files for your backend/DB? │
│ │
│ [y for Yes • n for No • h to go back] │
╰────────────────────────────────────────────────────────────────╯
Choose whether to include Docker configuration:
Generates:
-
Multi-stage Dockerfile with 4 optimized stages:
backend-builder- Compiles Go binary (golang:1.23-alpine)frontend-builder- Builds Vite app (oven/bun:latest)prod- Production API server (alpine:latest, ~20MB)frontend- Development frontend server (oven/bun:latest)
-
docker-compose.yml with 3 services:
app- Backend API server with environment configurationfrontend- Frontend development server on port 5173psql_gocozyy- PostgreSQL with health checks and volume persistence
- Develop locally without Docker
- Manually install PostgreSQL or use SQLite
- Smaller project footprint
Controls: y for Yes, n for No, h to go back
╭────────────────────────────────────────────────────────────────╮
│ Select your frontend stack: │
│ │
│ ● Vite + React + Tailwind + Bun │
│ ○ Vite + React + Tailwind + shadcn/ui + Bun │
│ │
│ [↑/↓ to navigate • space to select • y to confirm] │
╰────────────────────────────────────────────────────────────────╯
Choose your frontend configuration:
What You Get:
- React 18+ with TypeScript
- Vite for blazing-fast HMR and builds
- Tailwind CSS v4 with Vite plugin
- Bun as runtime and package manager
- TypeScript path aliases (
@/for clean imports) - Hot module replacement enabled
Generated Structure:
frontend/
├── src/
│ ├── App.tsx # Main app component
│ ├── index.css # Tailwind imports
│ └── main.tsx # Entry point
├── vite.config.ts # Vite + Tailwind plugin + @ alias
├── tailwind.config.ts # Tailwind v4 configuration
├── tsconfig.json # Base TypeScript config
├── tsconfig.app.json # App TypeScript config with paths
└── package.json # Bun dependencies
Perfect for:
- Quick prototypes
- Custom design systems
- Learning React + Tailwind
- Full control over component architecture
Everything from Option 1, PLUS:
Additional Dependencies:
lucide-react- Beautiful icon library (800+ icons)class-variance-authority- CVA for component variantsclsx- Conditional className utilitytailwind-merge- Intelligent Tailwind class mergingtailwindcss-animate- Animation utilities@radix-ui/react-slot- Radix UI primitives
Additional Files:
frontend/
├── components.json # shadcn/ui configuration
├── src/
│ ├── components/ui/
│ │ └── button.tsx # Pre-built Button component
│ └── lib/
│ └── utils.ts # cn() utility for class merging
└── [... all files from Option 1]
Example Button Component:
import { Button } from "@/components/ui/button"
<Button variant="default">Click me</Button>
<Button variant="destructive">Delete</Button>
<Button variant="outline" size="lg">Large Outline</Button>Ready to Add More Components:
# Add any shadcn/ui component with one command
bunx shadcn@latest add card
bunx shadcn@latest add dialog
bunx shadcn@latest add formPerfect for:
- Production applications
- Rapid UI development
- Accessible, polished interfaces
- Enterprise-grade design systems
Controls: ↑/↓ to navigate, space to select, y to confirm
╭────────────────────────────────────────────────────────────────╮
│ Summary of your project configuration: │
│ │
│ Project Name: my-awesome-project │
│ Framework: Chi │
│ Database: Postgres │
│ Docker: Yes │
│ Frontend: Vite + React + Tailwind + shadcn/ui + Bun │
│ │
│ [Enter/y to create • h to go back • q to quit] │
╰────────────────────────────────────────────────────────────────╯
Review your selections before generating the project.
Controls: Enter or y to create, h to go back, q to quit
✅ Project "my-awesome-project" created successfully!
🚀 Next steps to start nerding out:
1. cd my-awesome-project && nvim .
2. make docker-run # Start your Postgres database
3. make watch # Start backend with hot-reload (Air)
4. cd frontend && bun dev # Start React frontend environment
Happy coding!
After running the wizard, you'll get a fully configured project:
my-awesome-project/
├── backend/ # Go backend
│ ├── cmd/
│ │ └── server/
│ │ └── main.go # Backend entry point
│ ├── internal/
│ │ └── database/
│ │ └── database.go # DB connection (if selected)
│ ├── go.mod # Go dependencies
│ └── go.sum
├── frontend/ # React frontend
│ ├── src/
│ │ ├── components/ui/ # shadcn components (if selected)
│ │ ├── lib/
│ │ │ └── utils.ts # Utility functions
│ │ ├── App.tsx
│ │ ├── index.css # Tailwind imports
│ │ └── main.tsx
│ ├── components.json # shadcn config (if selected)
│ ├── vite.config.ts
│ ├── tailwind.config.ts
│ ├── tsconfig.json
│ └── package.json
├── Dockerfile # Multi-stage build (if Docker selected)
├── docker-compose.yml # Services config (if Docker selected)
├── .air.toml # Hot reload config
├── Makefile # Development commands
├── .env # Environment variables
└── .gitignore # Git ignore patterns
make watchUses Air for automatic restarts on code changes. Air is auto-installed if not present.
Watches:
*.gofiles*.sqlfiles- Template files (
.tpl,.tmpl,.html)
Excludes:
frontend/node_modulesfrontend/dist- Test files
make run
# or
cd backend && go run cmd/server/main.gomake build
./mainmake testmake cleancd frontend
# Start dev server (hot reload enabled)
bun dev
# Build for production
bun run build
# Preview production build
bun run preview
# Install new dependencies
bun add <package-name>Frontend runs on http://localhost:5173 by default.
Start Database:
make docker-run
# or
docker-compose up -d psql_gocozyyStop Database:
make docker-down
# or
docker-compose downConnect to Database:
docker exec -it psql_gocozyy psql -U sammy -d gocozyyView Logs:
docker-compose logs -f psql_gocozyySQLite database is created automatically when your app runs. Location is specified in your code:
db, err := database.NewSQLite("./app.db")Open 3 terminal windows:
# Terminal 1: Database (if using PostgreSQL + Docker)
make docker-run
# Terminal 2: Backend
make watch
# Terminal 3: Frontend
cd frontend && bun devVisit http://localhost:5173 - Vite will proxy API requests to http://localhost:8080/api/*.
All projects include a .env file with sensible defaults:
# Application Configuration
PORT=42069 # Backend API port
APP_ENV=local # Environment (local, dev, prod)
# PostgreSQL Configuration (if using Postgres)
GOCOZYY_DB_HOST=localhost
GOCOZYY_DB_PORT=5432
GOCOZYY_DB_DATABASE=gocozyy
GOCOZYY_DB_USERNAME=sammy
GOCOZYY_DB_PW=supersecretpassword
GOCOZYY_DB_SCHEMA=publicSecurity Note: The .env file is automatically added to .gitignore and has 0600 permissions (owner read/write only).
Both frontend options include @/ path alias for clean imports:
// Instead of this:
import { Button } from "../../components/ui/button";
// Write this:
import { Button } from "@/components/ui/button";Configured in tsconfig.json:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}Vite is configured with:
- Tailwind CSS v4 plugin
- Path resolution for
@/alias - React plugin with Fast Refresh
// vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
import path from "path";
export default defineConfig({
plugins: [react(), tailwindcss()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
});Configured with the new Vite plugin approach:
// tailwind.config.ts
import type { Config } from "tailwindcss";
export default {
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
} satisfies Config;Import in CSS:
/* src/index.css */
@import "tailwindcss";The .air.toml file configures automatic backend restarts:
root = "."
tmp_dir = "tmp"
[build]
cmd = "make build"
bin = "./main"
exclude_dir = ["frontend/node_modules", "frontend/dist", "tmp", "testdata"]
include_ext = ["go", "tpl", "tmpl", "html", "sql"]
delay = 1000 # ms
stop_on_error = trueProjects with Docker enabled include a complete docker-compose.yml:
docker-compose up -dThis starts:
- Backend API - Production build on port specified in
.env - Frontend Dev Server - Hot reload on port 5173
- PostgreSQL - Database with health checks on port 5432
# All services
docker-compose logs -f
# Specific service
docker-compose logs -f app
docker-compose logs -f frontend
docker-compose logs -f psql_gocozyydocker-compose down
# Stop and remove volumes (deletes database data)
docker-compose down -vdocker-compose up -d --buildapp:
build:
context: .
dockerfile: Dockerfile
target: prod
env_file: .env
depends_on:
psql_gocozyy:
condition: service_healthy- Multi-stage build for optimal image size (~20MB)
- Wait for database health check before starting
- Environment variables from
.envfile - Alpine-based production image with CA certificates
frontend:
build:
context: .
dockerfile: Dockerfile
target: frontend
ports:
- "5173:5173"
volumes:
- ./frontend:/app/frontend- Hot reload enabled with volume mounting
- Bun runtime for fast package installation
- Port 5173 exposed for development
psql_gocozyy:
image: postgres:latest
environment:
POSTGRES_USER: ${GOCOZYY_DB_USERNAME}
POSTGRES_PASSWORD: ${GOCOZYY_DB_PW}
POSTGRES_DB: ${GOCOZYY_DB_DATABASE}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${GOCOZYY_DB_USERNAME}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
- psql_data_gocozyy:/var/lib/postgresql/data- Persistent storage with named volume
- Health checks ensure database is ready
- Environment-based configuration from
.env
The multi-stage Dockerfile optimizes for both size and performance:
FROM golang:1.23-alpine AS backend-builder
# Compiles Go binary with CGO disabled
# Result: Single static binaryFROM oven/bun:latest AS frontend-builder
# Runs bun install and bun run build
# Result: Static files in frontend/distFROM alpine:latest AS prod
# Copies backend binary + frontend dist
# Installs CA certificates
# Result: Tiny image serving API + static frontendFROM oven/bun:latest AS frontend
# Development environment with hot reload
# Used by docker-compose for frontend serviceBuild and run the production image:
# Build production target
docker build -t my-app:latest --target prod .
# Run production container
docker run -d \
--name my-app \
-p 42069:42069 \
--env-file .env \
my-app:latestThe production image serves:
- Backend API on port from
.env(default: 42069) - Frontend static files from
/app/frontend/dist
Configuration:
- Framework: Standard Library
- Database: None
- Docker: No
- Frontend: Vite + React + Tailwind + Bun
Use Case:
- API gateway
- Microservice that consumes other APIs
- Static content server
- Serverless function development
Generated Backend:
// backend/cmd/server/main.go
package main
import (
"encoding/json"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
})
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", mux))
}Configuration:
- Framework: Chi
- Database: PostgreSQL
- Docker: Yes
- Frontend: Vite + React + Tailwind + shadcn/ui + Bun
Use Case:
- SaaS application
- Content management system
- E-commerce platform
- Data-driven dashboards
Start Development:
cd my-saas-app
make docker-run # Starts PostgreSQL
make watch # Starts backend with hot-reload
cd frontend && bun dev # Starts frontendDatabase Usage:
// backend/cmd/server/main.go
import "github.com/you/my-saas-app/backend/internal/database"
func main() {
db, err := database.NewPostgres()
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Use db for queries
// ...
}Configuration:
- Framework: Gin
- Database: SQLite
- Docker: No
- Frontend: Vite + React + Tailwind + Bun
Use Case:
- Desktop applications (with Tauri/Electron)
- Local-first apps
- Development tools
- Personal productivity apps
SQLite Usage:
// backend/cmd/server/main.go
import "github.com/you/my-desktop-app/backend/internal/database"
func main() {
db, err := database.NewSQLite("./data/app.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Database is embedded in your app
// ...
}Configuration:
- Framework: Chi
- Database: SQLite
- Docker: No
- Frontend: Vite + React + Tailwind + shadcn/ui + Bun
Use Case:
- Hackathons
- MVPs and prototypes
- Client demos
- Internal tools
Quick Component Development:
cd frontend
# Add shadcn components as needed
bunx shadcn@latest add card
bunx shadcn@latest add form
bunx shadcn@latest add dialog
bunx shadcn@latest add table// frontend/src/App.tsx
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
function App() {
return (
<div className="container mx-auto p-8">
<Card>
<CardHeader>
<CardTitle>My Awesome MVP</CardTitle>
</CardHeader>
<CardContent>
<Button onClick={() => fetch("/api/health")}>Check API Health</Button>
</CardContent>
</Card>
</div>
);
}Every project includes these preconfigured commands:
| Command | Description |
|---|---|
make build |
Compiles Go backend binary to ./main |
make run |
Runs backend with go run cmd/server/main.go |
make test |
Runs all Go tests with go test ./... |
make clean |
Removes compiled binaries and artifacts |
make watch |
Starts backend with Air hot-reload (auto-installs Air) |
make docker-run |
Starts PostgreSQL in Docker (if applicable) |
make docker-down |
Stops Docker containers |
- Language: Go 1.25.5
- CLI Framework: Cobra - Modern CLI applications
- TUI Framework: Bubble Tea - Terminal user interfaces
- Styling: Lipgloss - Style definitions for TUIs
- UI Components: Bubbles - TUI components
- Go: 1.23+
- Frameworks:
- Database Drivers:
- pgx v5 (PostgreSQL)
- go-sqlite3 (SQLite)
- Hot Reload: Air
- Containerization: Docker, docker-compose
- Runtime: Bun - Fast all-in-one JavaScript runtime
- Build Tool: Vite - Next generation frontend tooling
- Framework: React 18+ with TypeScript
- Styling: Tailwind CSS v4
- UI Library (Optional): shadcn/ui - Re-usable components
- UI Primitives: Radix UI - Accessible component primitives
- Icons: Lucide React - Beautiful icons
- Utilities:
- CVA - Class variance authority
- clsx - Conditional classes
- tailwind-merge - Merge Tailwind classes
Error: requires go >= 1.23
Solution: Update Go:
# Linux/macOS
curl -OL https://go.dev/dl/go1.23.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
# Verify
go versionError: gocozyy: command not found
Solution: Add to your shell profile:
# For bash
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc
source ~/.bashrc
# For zsh
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc
source ~/.zshrcError: exec: "bun": executable file not found in $PATH
Solution: Install Bun:
curl -fsSL https://bun.sh/install | bashError: permission denied creating project directory
Solution: Run from a directory where you have write permissions or use sudo:
cd ~ # Move to home directory
gocozyy createError: bind: address already in use
Solution: Change port in .env or kill the process:
# Find process using port 8080
lsof -i :8080
# Kill process
kill -9 <PID>
# Or change port in .env
PORT=8081Error: failed to connect to postgres://...
Solution: Ensure PostgreSQL is running:
# Check if Docker container is running
docker ps | grep psql_gocozyy
# Start if not running
make docker-run
# Check logs
docker logs psql_gozozyyAir starts but doesn't reload on changes
Solution: Check .air.toml exclude patterns and file extensions:
include_ext = ["go", "tpl", "tmpl", "html", "sql"]
exclude_dir = ["frontend/node_modules", "frontend/dist"]Error: Cannot find module '@/components/ui/button'
Solution: Ensure path aliases are configured:
# Check tsconfig.json has baseUrl and paths
cat frontend/tsconfig.json
# Restart TypeScript server in your editor
# VSCode: Cmd/Ctrl + Shift + P -> "TypeScript: Restart TS Server"Warning: dependency on psql_gocozyy not healthy
Solution: Check database logs and increase health check timeout:
# View database logs
docker-compose logs psql_gocozyy
# Check if PostgreSQL is ready
docker exec psql_gocozyy pg_isready -U sammyError: permission denied writing to volume
Solution: Fix volume permissions or use named volume:
# Remove and recreate volume
docker-compose down -v
docker-compose up -dDocker build uses stale files
Solution: Force rebuild without cache:
docker-compose build --no-cache
docker-compose up -dError: Cannot resolve @/components/ui/button
Solution: Verify components.json exists and paths are correct:
cat frontend/components.json
# Should show:
{
"aliases": {
"components": "@/components",
"utils": "@/lib/utils"
}
}Error: Cannot find components.json
Solution: Ensure you're in frontend directory:
cd frontend
bunx shadcn@latest add button-
Always check logs first:
# Backend logs with Air # Displayed in terminal where you ran `make watch` # Frontend logs # Displayed in terminal where you ran `bun dev` # Docker logs docker-compose logs -f
-
Clean rebuild often helps:
make clean make build cd frontend rm -rf node_modules bun install -
Verify environment variables:
cat .env # Check all values are correct -
Check port conflicts:
lsof -i :8080 # Backend lsof -i :5173 # Frontend lsof -i :5432 # PostgreSQL
- Non-Interactive Mode - Support CLI flags for CI/CD and automation
- Additional Backend Frameworks - Echo, Fiber, Gorilla Mux
- More Database Options - MySQL, MongoDB, Redis
- Authentication Templates - JWT, OAuth2, session-based auth
- API Documentation - Auto-generate Swagger/OpenAPI specs
- Testing Setup - Pre-configured testing frameworks and examples
- CI/CD Templates - GitHub Actions, GitLab CI, Jenkins pipelines
- Deployment Configs - Kubernetes, Railway, Fly.io, Vercel
- Additional Frontend Options - Vue, Svelte, Solid
- Monorepo Support - Turborepo, Nx integration
- GraphQL Support - gqlgen backend + Apollo client
- WebSocket Support - Real-time communication templates
- Migration Tools - Database migration generation (golang-migrate)
- Logging & Monitoring - Structured logging, OpenTelemetry
- Configuration Management - Viper, custom configs
- Plugin System - Community templates and extensions
- ✅ Interactive TUI with Bubble Tea
- ✅ Tailwind CSS v4 support
- ✅ shadcn/ui integration
- ✅ Docker multi-stage builds
- ✅ Air hot-reload configuration
- ✅ Bun runtime support
- ✅ TypeScript path aliases
We welcome contributions! Here's how you can help:
Open an issue with:
- Your OS and Go version
- Steps to reproduce
- Expected vs actual behavior
- Error messages and logs
Open an issue with:
- Clear description of the feature
- Use cases and benefits
- Proposed implementation (optional)
-
Fork the repository
git clone https://github.com/cozyydev/gocozyy.git cd gocozyy -
Create a feature branch
git checkout -b feature/amazing-feature
-
Make your changes
- Follow Go conventions and formatting
- Add comments for complex logic
- Update documentation if needed
-
Test your changes
# Test the CLI go run main.go create # Test generated project cd test-project make watch cd frontend && bun dev
-
Commit with clear messages
git add . git commit -m "feat: add support for Echo framework"
-
Push and create PR
git push origin feature/amazing-feature
# Clone repository
git clone https://github.com/cozyydev/gocozyy.git
cd gocozyy
# Install dependencies
go mod download
# Build
make build
# Run locally
go run main.go create
# Test changes
./main create- Run
gofmtbefore committing - Follow Effective Go guidelines
- Keep functions focused and small
- Add comments for exported functions
- Use meaningful variable names
To add a new backend framework or feature:
-
Create generator function in
internal/generator/// generate_myframework.go func generateMyFramework(config Config) error { // Implementation }
-
Add to wizard options in
internal/ui/wizard.goframeworkOptions := []RadioOption{ // ... existing options {Label: "MyFramework", Value: "myframework"}, }
-
Wire up in
internal/generator/generator.goswitch config.Framework { // ... existing cases case "myframework": if err := generateMyFramework(config); err != nil { return err } }
-
Test thoroughly with all combinations
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2025 gocozyy contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
This project is built with and inspired by amazing open-source tools:
- Cobra - For powerful CLI framework
- Bubble Tea - For delightful TUIs
- Lipgloss - For beautiful terminal styling
- Vite - For blazing-fast frontend tooling
- Bun - For incredible JavaScript performance
- shadcn/ui - For beautiful, accessible components
- Tailwind CSS - For utility-first styling
- The entire Go and React communities
- Documentation: You're reading it!
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Built with ❤️ using Go and Bubble Tea
Report Bug · Request Feature · Contribute
Star ⭐ this repo if you find it helpful!