0f492d807ebede6b983d517864cab01199faa24d
⚡Via
Pure Go reactive web framework.
Why Via?
Somewhere along the way, the web became tangled in layers of JavaScript, build chains, and frameworks stacked on frameworks. Via takes a radical stance:
- No templates.
- No JavaScript.
- No transpilation.
- No hydration.
- No front-end fatigue.
- Single SSE stream.
- Full reactivity.
- Pure Go.
Example
package main
import (
"github.com/go-via/via"
"github.com/go-via/via/h"
)
type CounterState struct{ Count int }
func main() {
v := via.New()
v.Page("/", func(c *via.Context) {
s := CounterState{Count: 0}
step := c.Signal(1)
increment := c.Action(func() {
s.Count += step.Int()
c.Sync()
})
c.View(func() h.H {
return h.Div(
h.P(h.Textf("Count: %d", s.Count)),
h.Label(
h.Text("Update Step: "),
h.Input(h.Type("number"), step.Bind()),
),
h.Button(h.Text("Increment"), increment.OnClick()),
)
})
})
v.Start(":3000")
}
🚧 Experimental
Via is still a newborn.
- Version
0.1.0nears. - Expect chaos.
Contributing
- Via is intentionally minimal — and so is contributing.
- If you love Go, simplicity, and meaningful abstractions — Come along for the ride!
- Fork, branch, build, break things.
- Follow the loop: ⚡Via → Context → Sync → 🧑💻 Signals/Actions → ⚡Via → 🗘
- Keep every line purposeful.
- Share feedback: open an issue or start a discussion.
Credits
Via builds upon the work of these amazing projects:
- 🚀 Datastar - The hypermedia powerhouse at the core of Via. It powers browser reactivity through Signals and enables real-time HTML/Signal patches over an always-on SSE event stream.
- 🧩 Gomponents - The awesome project that gifts Via with Go-native HTML composition superpowers through the
via/hpackage.
Thank you for building something that doesn’t just function — it inspires. 🫶