You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A personal, modular dashboard built with a Go backend and Svelte frontend. Drop in the widgets you want — adding a new one is three files.
3
+
A personal, modular dashboard built with a Go backend and Svelte frontend. Drop in the widgets you want — adding a new one is a few files each side.
4
+
5
+
Right now, this is entirely codified as opposed to pluggable within the browser.
6
+
7
+
This was made in conjunction with an AI Agent and purely being done as a way to refresh and relearn newer frameworks in conjunction with understanding the current agent model capabilities.
# Edit .env and add your ANTHROPIC_API_KEY at minimum
35
+
# Edit .env — ANTHROPIC_API_KEY is required at minimum
31
36
```
32
37
33
38
### 2. Run in development
@@ -44,42 +49,52 @@ make dev-frontend
44
49
45
50
Open [http://localhost:5173](http://localhost:5173).
46
51
47
-
### 3. Production build
48
-
49
-
```bash
50
-
make build
51
-
./bin/server
52
-
```
52
+
### 3. Production with Docker
53
53
54
-
Or with Docker:
55
54
```bash
56
55
docker compose up --build
57
56
```
58
57
58
+
Frontend is served by Nginx on port 80. The backend API is internal — Nginx proxies `/api/*` to it.
59
+
59
60
## Configuration
60
61
61
-
| Variable | Required | Description |
62
-
|---|---|---|
63
-
|`ANTHROPIC_API_KEY`| Yes | From [console.anthropic.com](https://console.anthropic.com/keys)|
64
-
|`GOOGLE_CREDENTIALS_JSON`| No | Path to service account JSON, or raw JSON string |
65
-
|`GOOGLE_CALENDAR_ID`| No | Calendar ID (default: `primary`) |
66
-
|`PORT`| No | Server port (default: `8080`) |
67
-
|`ALLOWED_ORIGINS`| No | CORS origins (default: `http://localhost:5173`) |
68
-
|`DASHBOARD_KEY`| No | Shared secret for `X-Dashboard-Key` header auth |
62
+
All configuration is via environment variables (`.env` file locally, secrets manager in production).
63
+
64
+
| Variable | Required | Default | Description |
65
+
|---|---|---|---|
66
+
|`ANTHROPIC_API_KEY`| Yes | — | From [console.anthropic.com](https://console.anthropic.com/keys)|
67
+
|`WANIKANI_API_TOKEN`| No | — | From [wanikani.com/settings/personal_access_tokens](https://www.wanikani.com/settings/personal_access_tokens) — enables WaniKani word source |
68
+
|`GOOGLE_CREDENTIALS_JSON`| No | — | Path to service account JSON file, or raw JSON string |
69
+
|`GOOGLE_CALENDAR_ID`| No |`primary`| Calendar ID from Google Calendar settings |
70
+
|`PORT`| No |`8080`| Backend listen port |
71
+
|`ALLOWED_ORIGINS`| No |`http://localhost:5173`| Comma-separated CORS origins |
72
+
|`DASHBOARD_KEY`| No | — | Shared secret for `X-Dashboard-Key` header — **set this in production**|
73
+
|`DATA_DIR`| No |`./data`| Directory for the embedded bbolt database |
└── layout.ts # Grid layout state + localStorage persistence
128
151
```
129
152
153
+
## Security
154
+
155
+
- API endpoints are optionally protected by a shared `X-Dashboard-Key` header (`DASHBOARD_KEY` env var) — **enable this if the dashboard is publicly reachable**
156
+
- CORS is restricted to `ALLOWED_ORIGINS`
157
+
- Request bodies are capped at 512 KB; messages at 32 KB
158
+
- Chat sessions expire after 24 hours of inactivity
159
+
- Containers run as non-root
160
+
- Raw errors from external APIs are never forwarded to the client
0 commit comments