Datapages

April 25, 2026 ยท View on GitHub

CI golangci-lint Coverage Status Go Report Card Go Reference License: MIT Alpha

๐Ÿงช Alpha Software: Datapages is still in early development ๐Ÿšง.
APIs are subject to change and you may encounter bugs.

A Templ + Go + Datastar web framework for building dynamic, server-rendered web applications in pure Go.

Focus on your business logic, generate the boilerplate Datapages parses your app source package and generates all the wiring. Routing, sessions and authentication, SSE streams, CSRF protection, type-safe URL and action helpers, Prometheus metrics - so your application code stays clean and takes full advantage of Go's strong static typing and high performance.

No matter whether you're building real-time collaborative dynamic web app or simple HTMX-style websites - Datapages will serve you well.

Examples

  • counter โ€” Minimal real-time counter. Bare bones starting point.
  • fancy-counter โ€” Fancy real-time collaborative counter.
  • todolist โ€” Real-time collaborative todo list with per-tab server-side state (Most Tao conform example).
  • calculator โ€” Hybrid calculator app that runs both as a multi-client server and single-client Desktop app.
  • classifieds โ€” Full-featured classifieds marketplace with sessions, auth, Prometheus metrics, Grafana dashboards and load testing.
  • tailwindcss โ€” Minimal static page demonstrating Tailwind CSS integration.
  • webcomponents โ€” Landing page with vanilla and Lit-based Web Components bundled via esbuild through a custom watcher.
  • sqlitesessions โ€” Custom sessmanager.SessionManager implementation backed by SQLite via sqinn-go (no cgo).

Getting Started

Install

go install github.com/romshark/datapages@latest

Initialize New Project

datapages init

CLI Commands

CommandDescription
datapages initInitialize a new project with scaffolding and configuration.
datapages genParse the app model and generate the datapages package.
datapages watchStart the live-reloading development server.
datapages lintValidate the app model without generating code.
datapages versionPrint CLI version information.

Configuration

Datapages reads configuration from datapages.yaml or datapages.yml in the module root. If both files exist, the CLI treats that as an error.

The default scaffold created by datapages init looks like this:

app: app
gen:
  package: datapagesgen
  prometheus: true
cmd: cmd/server
watch:
  exclude:
    - ".git/**" # git internals
    - ".*"      # hidden files/directories
    - "*~"      # editor backup files

Optional sections can be added as needed:

assets:
  url-prefix: /static/
  dir: ./app/static/

These top-level keys are supported:

  • app: path to the app source package. Default: app
  • gen.package: path to the generated package. Default: datapagesgen
  • gen.prometheus: enable Prometheus metric generation. Default: true
  • cmd: path to the server command package. Default: cmd/server
  • assets: embedded static asset serving configuration
  • watch: development server settings

When assets is set, both fields are required. url-prefix must start and end with / and cannot be /.

When gen.prometheus is set to false, the generated server code will not include Prometheus imports, metric variables, or the WithPrometheus server option. Use datapages init --prometheus=false to scaffold a project without Prometheus.

The optional watch section configures the development server (host, proxy timeout, debounce, TLS, compiler flags, logging, custom watchers, etc.).

Specification

See SPECIFICATION.md for the full source package specification, including handler signatures, parameters, return values, events, sessions, and modules.

See FAQ.md for frequently asked questions.

Modules

Datapages ships pluggable modules with swappable implementations:

Motivation

The reason I built Datapages is that the combination of Datastar + Go + Templ is my preferred way of writing server-centric web applications. But in every project I used this tech stack for I kept repeating the same code patterns and solving the same problems over and over again. I realized many developers are repeating the same patterns too and struggle with the common pitfalls:

  • How to handle SSE streams correctly?
  • How to use NATS effectively?
  • How to approach security and authentication?
  • How to configure a convenient hot-reload for development?
  • How to keep the code maintainable over time, especially when you add more developers and/or AI assistants?
  • How to keep AI coding assistants from drifting too much?
  • How to achieve optimal performance and a good UX for endusers?

Your Datastar frontends are your rocket to extraterrestrial worlds of the internet. The further you want to go, the heavier a rocket you'll require. Hence, you need powerful boosters to get it off the ground and overcome Earth's gravity. Such boosters exist in the form of awesome templates like zangster300/northstar, which will quickly get your rocket to the stratosphere and beyond. But power alone is not enough โ€” you also need good stabilizing fins and thrust vectoring to keep your rocket steady as it flies. I felt like this part was lacking in the Go ecosystem of Datastar. By enforcing a common structure of types, methods and other conventions with tooling, Datapages provides not only the power but also the stability your rocket needs to stay in flight for long and consume as little brain fuel as possible.

Not only does Datapages allow you to start quickly with datapages init and jump straight into building your application, but it also continuously supports you keeping accidental complexity low by:

  • Providing a Datastar Tao oriented architecture as a good default while preserving enough flexibility to go beyond if you need to.
  • Providing datapages gen to generate all boilerplate code consistently and guide you and your AI coding agents.
  • Providing datapages lint that can be used in CI/CD workflows for extensive static code analysis.
  • Providing datapages watch to give you an interactive hot-reload environment for a fast feedback loop with error reporting directly in the browser preview.

Agentic coding is a big topic right now and likely here to stay. But LLMs tend to drift over time and introduce accidental complexity. So for AI to be used more effectively I wanted to provide the skills and instructions necessary for agents to know how to deal with this tech stack and call into Datapages CLI help them when they drift by providing them with useful feedback.

Who This Is For

Datapages is a good fit if you:

  • Already write your backend in Go and want to build your web frontend in the same language and toolchain.
  • Are building a server-rendered application, where the server owns the data; not a local-first offline-capable SPA.
  • Already use Datastar and want a Go framework to help you ship faster with less code while preserving maintainability.
  • Already use Templ and want a full framework built around it.
  • Use HTMX, idiomorph and Alpine.js, and instead want a single cohesive stack with a smaller bundle size and less spaghetti-code.
  • Don't want to maintain a separate REST/GraphQL API just to feed your frontend.
  • Want to deploy as a single, statically compiled binary that makes the most of your hardware.
  • Want to develop hybrid desktop apps in Go and HTML5 (see Calculator example)

Contributing

See CLAUDE.md for code style, testing conventions, commit message format, and project structure.

Use the example/classifieds/ application as a real-world test fixture when developing Datapages.