Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f6c5916ce |
75
README.md
75
README.md
@@ -1,30 +1,33 @@
|
|||||||
# ⚡Via
|
# Via
|
||||||
|
|
||||||
Real-time engine for building reactive web applications in pure Go.
|
Real-time engine for building reactive web applications in pure Go.
|
||||||
|
|
||||||
|
|
||||||
## Why Via?
|
## 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:
|
The web became tangled in layers of JavaScript, build chains, and frameworks stacked on frameworks. Via takes a different path.
|
||||||
|
|
||||||
- No templates.
|
**Philosophy**
|
||||||
- No JavaScript.
|
- No templates. No JavaScript. No transpilation. No hydration.
|
||||||
- No transpilation.
|
- Views are pure Go functions. HTML is composed with a type-safe DSL.
|
||||||
- No hydration.
|
- A single SSE stream carries all reactivity — no WebSocket juggling, no polling.
|
||||||
- No front-end fatigue.
|
|
||||||
- Single SSE stream.
|
|
||||||
- Full reactivity.
|
|
||||||
- Built-in Brotli compression.
|
|
||||||
- Pure Go.
|
|
||||||
|
|
||||||
|
**Batteries included**
|
||||||
|
- Automatic CSRF protection on every action call
|
||||||
|
- Token-bucket rate limiting (global defaults + per-action overrides)
|
||||||
|
- Cookie-based sessions backed by SQLite
|
||||||
|
- Pub/sub messaging with an embedded NATS backend
|
||||||
|
- Structured logging via zerolog
|
||||||
|
- Graceful shutdown with context draining
|
||||||
|
- Brotli compression out of the box
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-via/via"
|
"github.com/ryanhamamura/via"
|
||||||
"github.com/go-via/via/h"
|
"github.com/ryanhamamura/via/h"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Counter struct{ Count int }
|
type Counter struct{ Count int }
|
||||||
@@ -57,25 +60,43 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## What's built in
|
||||||
|
|
||||||
## 🚧 Experimental
|
- **Reactive views + signals** — bind state to the DOM; changes push over SSE automatically
|
||||||
<s>Via is still a newborn.</s> Via is taking its first steps!
|
- **Components** — self-contained subcontexts with their own data, actions, and signals
|
||||||
- Version `0.1.0` released.
|
- **Sessions** — cookie-based, backed by SQLite via `scs`
|
||||||
- Expect a little less chaos.
|
- **Pub/sub** — embedded NATS server with JetStream; generic `Publish[T]` / `Subscribe[T]` helpers
|
||||||
|
- **CSRF protection** — automatic token generation and validation on every action
|
||||||
|
- **Rate limiting** — token-bucket algorithm, configurable globally and per-action
|
||||||
|
- **Event handling** — `OnClick`, `OnChange`, `OnSubmit`, `OnInput`, `OnFocus`, `OnBlur`, `OnMouseEnter`, `OnMouseLeave`, `OnScroll`, `OnDblClick`, `OnKeyDown`, and `OnKeyDownMap` for multi-key bindings
|
||||||
|
- **Timed routines** — `OnInterval` with start/stop/update controls, tied to context lifecycle
|
||||||
|
- **Redirects** — `Redirect`, `ReplaceURL`, and format-string variants
|
||||||
|
- **Plugin system** — `func(v *V)` hooks for integrating CSS/JS libraries
|
||||||
|
- **Structured logging** — zerolog with configurable levels; console output in dev, JSON in production
|
||||||
|
- **Graceful shutdown** — listens for SIGINT/SIGTERM, drains contexts, closes pub/sub
|
||||||
|
- **Context lifecycle** — background reaper cleans up disconnected contexts; configurable TTL
|
||||||
|
- **HTML DSL** — the `h` package provides type-safe Go-native HTML composition
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The `internal/examples/` directory contains 14 runnable examples:
|
||||||
|
|
||||||
|
`chatroom` · `counter` · `countercomp` · `greeter` · `keyboard` · `livereload` · `nats-chatroom` · `pathparams` · `picocss` · `plugins` · `pubsub-crud` · `realtimechart` · `session` · `shakespeare`
|
||||||
|
|
||||||
|
## Experimental
|
||||||
|
|
||||||
|
Via is maturing — sessions, CSRF, rate limiting, pub/sub, and graceful shutdown are in place — but the API is still evolving. Expect breaking changes before `v1`.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
- Via is intentionally minimal and opinionated — and so is contributing.
|
- Via is intentionally minimal and opinionated — and so is contributing.
|
||||||
- If you love Go, simplicity, and meaningful abstractions — Come along for the ride!
|
- Fork, branch, build, tinker, submit a pull request.
|
||||||
- Fork, branch, build, tinker with things, submit a pull request.
|
|
||||||
- Keep every line purposeful.
|
- Keep every line purposeful.
|
||||||
- Share feedback: open an issue or start a discussion.
|
- Share feedback: open an issue or start a discussion.
|
||||||
|
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
Via builds upon the work of these amazing projects:
|
Via builds upon the work of these projects:
|
||||||
|
|
||||||
- 🚀 [Datastar](https://data-star.dev) - 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.
|
- [Datastar](https://data-star.dev) — the hypermedia framework powering browser reactivity through signals and real-time HTML patches over SSE.
|
||||||
- 🧩 [Gomponents](https://maragu.dev/gomponents) - The awesome project that gifts Via with Go-native HTML composition superpowers through the `via/h` package.
|
- [Gomponents](https://maragu.dev/gomponents) — Go-native HTML composition that powers the `via/h` package.
|
||||||
|
|
||||||
> Thank you for building something that doesn’t just function — it inspires. 🫶
|
|
||||||
|
|||||||
Reference in New Issue
Block a user