feat: rewrite to stateless web app with IndexedDB frontend

Replace CLI + SQLite architecture with a Go web server + vanilla JS
frontend using IndexedDB for all client-side data storage.

- Remove: cli, store, report, static packages
- Add: compute engine (BuildDashboard), server package, web UI
- Add: setup page with CRUD for profiles, rooms, devices, occupants, AC
- Add: dashboard with SVG temperature timeline, risk analysis, care checklist
- Add: i18n support (English/German) with server-side Go templates
- Add: LLM provider selection UI with client-side API key storage
- Add: per-room indoor temperature, edit buttons, language-aware AI summary
This commit is contained in:
2026-02-09 13:31:38 +01:00
parent a89720fded
commit d5452409b6
65 changed files with 3862 additions and 5332 deletions

39
cmd/heatguard/main.go Normal file
View File

@@ -0,0 +1,39 @@
package main
import (
"flag"
"fmt"
"log"
"os"
"github.com/cnachtigall/heatwave-autopilot/internal/config"
"github.com/cnachtigall/heatwave-autopilot/internal/server"
"github.com/cnachtigall/heatwave-autopilot/web"
)
func main() {
port := flag.Int("port", 8080, "HTTP port")
dev := flag.Bool("dev", false, "development mode (serve from filesystem)")
flag.Parse()
cfg := config.Load()
// Set the embedded filesystem for the server package
server.WebFS = web.FS
srv, err := server.New(server.Options{
Port: *port,
DevMode: *dev,
Config: cfg,
})
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
addr := fmt.Sprintf(":%d", *port)
log.Printf("HeatGuard listening on http://localhost%s", addr)
if err := srv.ListenAndServe(addr); err != nil {
log.Fatal(err)
}
}

View File

@@ -1,13 +0,0 @@
package main
import (
"os"
"github.com/cnachtigall/heatwave-autopilot/internal/cli"
)
func main() {
if err := cli.Execute(); err != nil {
os.Exit(1)
}
}