ryan 13e9fead35 chore(release): bump version to v1.3.0
### 🛠 修复
- 修复了存储驱动切换保存后上传记录未同步指向新后端的问题。
- 修复了 S3 不可达时无法暂存本地存储配置的问题。
- 修复了文件软删除后增量统计未正确扣减的问题。
- 修复了 Snowflake ID 生成异常或出现负值时的不可靠行为,增加重试与集中错误处理。
- 修复了自更新流程中解压文件名不匹配导致更新失败的问题。
- 修复了用户列表按 ID 排序方向不正确的问题。
- 修复了前端服务层循环依赖导致构建失败的问题。

### ⚡️ 优化与改进
- 新增 upload.Ingest 程序化上传域服务,统一对象写入、上传记录与增量统计,支持秒传、Worker 摄取与镜像去重策略。
- 新增文件上传统计全量重建异步任务,可在管理端触发以修复历史统计偏差。
- 存储配置收敛为单一 storage_config 来源,移除逐条上传记录的 storage_driver 冗余字段。
- 抽取 repository 层并瘦身 HTTP Handler,统一 Abort 系列错误响应与链路追踪集成。
- 将进程级初始化从 router 迁至 bootstrap/cmd,任务与推送改为显式装配,消除 init 副作用。
- 认证与用户模块通过 listener 域事件解耦推送,避免核心业务直接依赖通知模块。
- 分离 user 模块 Handler 与 Logic 边界,便于 Worker 与单元测试复用业务逻辑。
- 引入系统配置内存缓存与验证码运行时配置快照,降低高频配置读取的数据库压力。
- 优化上传热路径与管理端增量统计表,文件统计查询由全表扫描降为常数级读取。
- 前端拆分管理端 bundle、并行化鉴权与公共配置加载,并虚拟化日志列表以提升首屏与滚动性能。

### 💄 其他/体验
- 新增 file-upload 开发技能,并将 AGENTS.md Skill 索引整理为分类表格。
- 优化文件管理统计页在 Tab 切换与再次进入时的自动刷新,避免展示过期缓存数据。
- 优化异步任务日志的展示与清理体验。
- 前端管理组件就近归位并拆分服务层目录,提升代码可维护性。
2026-06-18 15:14:38 +08:00
2026-06-18 10:29:48 +08:00
2026-06-16 10:08:21 +08:00
2026-06-16 09:58:15 +08:00
2026-06-16 10:08:21 +08:00
2026-06-09 16:47:49 +08:00
2026-06-09 16:47:49 +08:00
2026-06-16 09:58:15 +08:00
2026-06-08 20:34:27 +08:00
2026-06-16 09:58:15 +08:00
2026-06-18 10:29:48 +08:00
2026-06-11 15:32:44 +08:00
2026-06-09 16:47:49 +08:00
2026-06-16 09:58:15 +08:00
2026-06-08 23:14:57 +08:00
2026-06-16 09:58:15 +08:00
2026-06-10 11:33:33 +08:00
2026-06-16 10:08:21 +08:00
2026-06-10 11:33:33 +08:00
2026-06-09 21:45:57 +08:00
2026-06-09 21:45:57 +08:00

wavelet

🚀 A modern, production-ready full-stack boilerplate for building scalable web applications

中文

License: Apache2.0 Go Version Next.js React

📖 Introduction

wavelet is a generic, production-ready full-stack boilerplate built with Go (Gin + GORM) on the backend and Next.js (App Router + Shadcn UI) on the frontend. It ships with everything you need to bootstrap a modern SaaS, internal tool, or developer platform — without the boilerplate headaches.

The project was designed from the ground up to be framework-first and business-agnostic: plug in your own domain logic while reusing the battle-tested infrastructure that comes out of the box.

✨ Key Features

  • 🔐 Multi-auth System — Local password login/registration + pluggable OIDC/OAuth2 providers (supports multiple auth sources simultaneously)
  • 🗝️ Personal Access Tokens — API key management for programmatic access; supports Authorization: Bearer and X-Access-Token headers
  • 👤 User Management — Admin panel for listing, searching, filtering, enabling/disabling user accounts
  • ⚙️ Dynamic System Config — Key-value system configuration management with live reload, controllable from the admin UI
  • 📋 Async Task Queue — Background job processing with Asynq (Redis-backed), including a scheduling dashboard
  • 📁 S3 File Storage — Unified file upload/download via S3-compatible APIs with local disk cache
  • 📊 Observability — Structured logging (Zap) + distributed tracing (OpenTelemetry)
  • 🎨 Modern UI — Responsive, dark-mode-ready design system built with Tailwind CSS 4 and Shadcn UI
  • 📖 Built-in Documentation — Integrated docs portal with usage guides, API reference, privacy policy, and terms of service

🏗️ Architecture Overview

┌─────────────────┐    ┌─────────────────────────────┐    ┌─────────────────┐
│   Frontend      │    │          Backend             │    │   Database      │
│   (Next.js)     │◄──►│           (Go)               │◄──►│  (PostgreSQL)   │
│                 │    │                              │    │                 │
│ • React 19      │    │ • Gin HTTP Framework         │    │ • PostgreSQL    │
│ • TypeScript    │    │ • GORM ORM                   │    │ • Redis Cache   │
│ • Tailwind 4    │    │ • Multi-provider Auth        │    │                 │
│ • Shadcn UI     │    │ • AccessToken Middleware     │    │                 │
│                 │    │ • Asynq Task Queue           │    │                 │
│                 │    │ • OpenTelemetry Tracing      │    │                 │
│                 │    │ • Swagger API Docs           │    │                 │
└─────────────────┘    └─────────────────────────────┘    └─────────────────┘
                                      │
                           ┌──────────┴──────────┐
                           │   Multi-Process CLI  │
                           │  (Cobra + Viper)     │
                           │ • api      (HTTP)    │
                           │ • worker   (Queue)   │
                           │ • scheduler(Cron)    │
                           └─────────────────────┘

🛠️ Tech Stack

Backend

  • Go 1.25+ — Primary language
  • Gin — HTTP web framework
  • GORM — ORM with PostgreSQL & ClickHouse support
  • Redis — Cache, session store, and task queue backend
  • Asynq — Distributed task queue (Redis-backed)
  • Cobra + Viper — CLI entrypoint and configuration management
  • OpenTelemetry — Distributed tracing and observability
  • Zap — Structured, high-performance logging
  • Swagger (Swaggo) — Auto-generated API documentation
  • AWS SDK v2 — S3-compatible file storage
  • Snowflake — Distributed ID generation

Frontend

📋 Requirements

  • Go >= 1.25
  • Node.js >= 18.0
  • PostgreSQL >= 14
  • Redis >= 6.0
  • pnpm >= 8.0 (recommended)

🚀 Quick Start

1. Clone the Repository

git clone https://github.com/Rain-kl/Wavelet.git refreshing
cd refreshing

2. Configure Environment

cp config.example.yaml config.yaml

Edit config.yaml to configure your database and Redis. OIDC auth sources are configured at runtime in the admin settings page.

3. Initialize Database

# Start local dependencies (PostgreSQL + Redis)
docker compose up -d

# Optional: also start ClickHouse
docker compose --profile clickhouse up -d

# If you use an external PostgreSQL instance instead of Docker, create the database manually
createdb -h <host> -p 5432 -U postgres refreshing

# Database schema is auto-migrated on first startup

4. Start the Backend

# Install Go dependencies
go mod tidy

# Generate Swagger API documentation
make swagger

# Start the HTTP API server
go run main.go api

The backend also supports separate scheduler and worker processes for async task processing:

go run main.go scheduler   # Cron job scheduler
go run main.go worker      # Asynq task worker

5. Start the Frontend

cd frontend

# Install dependencies
pnpm install

# Start dev server (Turbopack)
pnpm dev

6. Access the Application

Service URL
Frontend http://localhost:3000
Swagger API Docs http://localhost:8000/swagger/index.html
Health Check http://localhost:8000/api/health

⚙️ Configuration

Key configuration options (see config.example.yaml for the full reference):

Option Description Example
app.addr Backend listen address :8000
database.host PostgreSQL host 127.0.0.1
database.database Database name refreshing
redis.host Redis host 127.0.0.1
storage.endpoint S3-compatible endpoint s3.amazonaws.com

🔧 Development Guide

Backend

# Run API server
go run main.go api

# Run task scheduler
go run main.go scheduler

# Run async worker
go run main.go worker

# Regenerate Swagger docs (required after controller changes)
make swagger

# Format & vet code
make tidy

Frontend

cd frontend

# Development mode (Turbopack)
pnpm dev

# Production build
pnpm build

# Start production server
pnpm start

# Lint & format
pnpm lint
pnpm format

📁 Project Structure

wavelet/
├── main.go                  # Entry point (delegates to internal/cmd)
├── config.example.yaml      # Configuration template
├── Makefile                 # Common commands (swagger, tidy, license, cross-build)
├── docker/                  # Docker image build files (integrated/frontend/backend)
├── docs/                    # Swagger auto-generated docs
├── frontend/                # Next.js frontend application
│   ├── app/                 # App Router pages
│   ├── components/          # React components (ui, common, layout)
│   ├── lib/services/        # API service layer
│   └── types/               # TypeScript type definitions
└── internal/                # Go backend (private)
    ├── cmd/                 # CLI commands (api, scheduler, worker)
    ├── apps/                # Business modules (oauth, user, admin, upload)
    ├── model/               # GORM entities and business methods
    ├── router/              # HTTP route registration
    ├── task/                # Async task definitions and workers
    ├── db/                  # Database and Redis initialization
    ├── storage/             # S3 file storage abstraction
    └── common/              # Shared utilities and response helpers

📚 API Documentation

Swagger API documentation is auto-generated and available once the backend is running:

http://localhost:8000/swagger/index.html

The built-in frontend docs portal at /docs includes:

  • Usage Guide — Step-by-step walkthrough for getting started
  • API Reference — Detailed interface documentation
  • Privacy Policy — Template privacy policy (customize as needed)
  • Terms of Service — Template terms of service

🧪 Testing

# Backend tests
go test ./...

# Frontend lint
cd frontend && pnpm lint

🚀 Deployment

Cross-platform Binary

Build static binaries for all 6 targets (Linux / macOS / Windows × amd64 / arm64) with a single command. The compiled frontend is embedded in every binary — no separate deployment needed.

Prerequisites: Docker with BuildKit enabled (Docker 23+ defaults to on).

# Build all 6 binaries → ./bin/
make cross-build

# Stamp a release version
make cross-build VERSION=v1.2.3

# Build only a specific OS (both architectures)
make cross-build GOOS=linux
make cross-build GOOS=darwin
make cross-build GOOS=windows

# Build only a specific architecture (all OSes)
make cross-build GOARCH=amd64
make cross-build GOARCH=arm64

# Combine filters — single binary
make cross-build GOOS=linux GOARCH=arm64
make cross-build GOOS=darwin GOARCH=amd64 VERSION=v1.2.3

Output files in ./bin/:

File Platform
wavelet_linux_amd64 Linux x86-64
wavelet_linux_arm64 Linux ARM64
wavelet_darwin_amd64 macOS Intel
wavelet_darwin_arm64 macOS Apple Silicon
wavelet_windows_amd64.exe Windows x86-64
wavelet_windows_arm64.exe Windows ARM64

The version string is accessible at runtime via wavelet --version.

Docker

# Build image
docker build -t refreshing .

# Run (pass your config as a volume mount)
docker run -d -p 8000:8000 \
  -v $(pwd)/config.yaml:/app/config.yaml \
  refreshing api

Production

  1. Build the frontend:

    cd frontend && pnpm build
    
  2. Compile the backend:

    go build -o refreshing main.go
    
  3. Configure config.yaml for production.

  4. Start services:

    ./refreshing api        # HTTP API
    ./refreshing scheduler  # Cron scheduler (optional)
    ./refreshing worker     # Task worker (optional)
    

🤝 Contributing

We welcome contributions! Please read the following before submitting code:

Workflow

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes (git commit -am 'Add your feature')
  4. Push to the branch (git push origin feature/your-feature)
  5. Open a Pull Request

📄 License

This project is licensed under the Apache 2.0 License.

Languages
Go 56.6%
TypeScript 35.1%
CSS 4.7%
Lua 1.5%
HTML 0.8%
Other 1.2%