This repository is a minimal dashboard skeleton for the Universal Framework.
Phase 0 provides a working baseline with zero domain business logic:
- UI8Kit Shell-based layout with header and sidebar navigation
- Responsive mobile Sheet panel
- Theme toggle (light/dark) with persistence
- Locale switcher for English and Russian using embedded fixtures
- One preconfigured
Welcomefeature with a greeting page - Server-side rendering with
a-h/templ - Feature-based module system (
Feature+AppBuilder) - CQRS dispatcher with validation and logging pipeline behaviors
- Structured request logging, request IDs, panic recovery middleware
- Tailwind CSS 4 build pipeline and static asset serving
- Go
1.25.5+ net/http(stdlib)log/sloggithub.com/a-h/templgithub.com/fastygo/ui8kit v0.2.1github.com/google/uuid- Tailwind CSS 4 (
tailwindcss,@tailwindcss/cli)
Core parts:
cmd/server/main.gois the composition rootcmd/docs/main.gois the docs composition rootpkg/apphas config, app builder, and feature interfacespkg/core/cqrshas dispatcher, behaviors, and handler interfacespkg/webhas middleware, templ render helper, and error handlinginternal/application/welcomehas welcome query/handler use-caseinternal/infra/features/welcomehas welcome HTTP/templ adapterinternal/site/web/viewscontainslayout,welcomepage, and language partialinternal/site/web/i18nstores embeddeden/ruJSON contentinternal/site/web/staticstores Tailwind entry, UI8Kit CSS, and browser scriptsinternal/application/docshandles docs query use-cases and pre-renderinginternal/site/docs/contentcontains docs markdown sourcesinternal/site/docs/web/viewscontains docs templatesinternal/site/docs/web/staticstores docs CSS and docs shell scriptinternal/infra/features/docshandles docs routes and renderingdocs/QUICKSTART.mdhas a shorter startup guide
- Go
1.25.5or newer - Node.js
20+ - Bash (required for the
sync:ui8kitscript in.sh)
From repository root:
npm install
go mod download
go mod download github.com/fastygo/ui8kit@v0.2.1
npm run sync:ui8kitnpm run build:css
go run github.com/a-h/templ/cmd/templ@v0.3.1001 generate
go run ./cmd/serverIf make is available:
make devmake build
./bin/frameworknpm run build:docs:css
go run ./cmd/docsIf make is available:
make dev-docsBuild docs binary:
make build-docs
./bin/docsnpm run generatemake testOr run static checks:
make lintCI-friendly:
make cimake ci is the preferred command for local or CI parity.
Or equivalent alias:
make lint-ciOn environments without make (for example, plain Windows shell), run:
go test ./...
go run ./scripts/check-no-root-imports.gonpm run build:css
npm run dev:cssOr using Makefile:
make css-build
make css-devOpen:
http://127.0.0.1:8080http://127.0.0.1:8081/docs
You should see:
- Dashboard shell with sidebar and mobile sheet behavior
- Header language switcher
- Header theme switcher
- Welcome page with title, description, and button
APP_BIND(default:127.0.0.1:8080)APP_STATIC_DIR(default:internal/site/web/static)- Docs site defaults:
APP_BIND(default:127.0.0.1:8081in docs entrypoint)APP_STATIC_DIR(default:internal/site/docs/web/static)
APP_DEFAULT_LOCALE(default:en)APP_AVAILABLE_LOCALES(default:en,ru)APP_DATA_SOURCE(default:fixture)
This project started as a practical bootstrap for teams that need a repeatable dashboard baseline without waiting on a monolithic framework setup.
Goals at the start:
- Reduce time from
git cloneto first render to a few minutes. - Keep the runtime stack simple and transparent.
- Provide a standard structure for future features and modules without forcing business rules early.
- Make frontend shell, shell behavior, i18n, and page rendering available from day one.
The result is a Phase 0 skeleton where most teams can replace only feature modules and content while keeping the same delivery pattern.
net/httpas the only runtime server layer.log/slogfor structured logging.- No generated framework bootstrap (except template generation for SSR).
- Predictable request flow through explicit middleware and typed app builder.
- UI8Kit provides a ready-to-use shell, components, icons, and layout behaviors.
- Tailwind CSS 4 is used for deterministic utility-first styling and fast compile-time changes.
- A stable HTML entry (Shell + Sheet + header actions) is guaranteed from day one.
Featuremodules isolate routes, navigation, and handlers.- CQRS with pipeline behaviors provides a predictable command/query shape even in simple skeletons.
- Embedded fixtures make locale/content changes easy without introducing extra services in Phase 0.
UI8Kit was selected as the default UI layer for this phase because:
- It gives a complete shell pattern (
Shell,Nav, header actions) out of the box. - It reduces custom layout code and CSS drift.
- It ships with ready components (
Title,Text,Button, cards, mobile Sheet, icon set). - It matches Tailwind utilities and supports dark mode and responsive behavior naturally.
For a starter boilerplate this means less UI plumbing and more time focused on business features.
- No
hubcore/hubrelaydependency and no hidden reflection-based DI by default. - Pure Go feature composition in
main.go. - Embedded fixtures (
go:embed) for i18n and content bootstrap. - Strong defaults for locale, static path, and bind address through
pkg/app/config.go. - Explicit and low-ceremony CQRS usage with logging + validation behaviors.
- One repository command flow (
build,dev,test) that stays reproducible.
If make is not found, run the explicit command sequence from the “Build and run” section.
If you still see old behaviour after pulling changes, do a hard refresh in the browser (Ctrl+F5) to clear old cached JS/CSS output.
If you run:
go run ./cmd/serverand get:
bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
it means another process is already listening on port 8080.
netstat -ano | findstr :8080
taskkill /PID <PID> /FGet-NetTCPConnection -LocalPort 8080 -State Listen | Select-Object -ExpandProperty OwningProcess
Stop-Process -Id <PID> -Forcelsof -i :8080
kill -9 <PID>For quick local start with a different port:
APP_BIND=127.0.0.1:8081 go run ./cmd/server