+ The Dashboard Skill for OpenClaw
+ Stop configuring dashboards. Just tell OpenClaw what you want to see.
+
-> **The Dashboard Skill for OpenClaw**
->
-> Stop configuring dashboards. Just tell OpenClaw what you want to see.
+---
Glance is a **free and open source** dashboard that OpenClaw builds and manages for you. Not another app to configure — a skill that gives OpenClaw a visual command center.
Tell OpenClaw _"show me my GitHub PRs"_ and watch it build the widget. Ask _"what needs my attention?"_ and OpenClaw reads your dashboard and tells you. No manual setup. No YAML files. No `.env` hell.
-

---
@@ -44,6 +50,7 @@ curl -fsSL https://openglance.dev/install.sh | bash
```
This will:
+
- Clone the repository to `~/.glance`
- Install dependencies via pnpm
- Offer to install as a background service (launchd on macOS, systemd on Linux)
@@ -80,12 +87,14 @@ cd ~/.glance # or your Glance directory
```
Benefits:
+
- ✅ Starts automatically on login
- ✅ Restarts on crash
- ✅ Logs to `~/Library/Logs/glance/`
- ✅ Survives terminal closes
Commands:
+
```bash
# Stop service
launchctl unload ~/Library/LaunchAgents/com.glance.dashboard.plist
@@ -108,12 +117,14 @@ cd ~/.glance # or your Glance directory
```
Benefits:
+
- ✅ Starts automatically on login
- ✅ Restarts on crash
- ✅ Integrates with journald
- ✅ Survives terminal closes
Commands:
+
```bash
# Stop service
systemctl --user stop glance
@@ -263,14 +274,14 @@ OpenClaw: *validates, checks credentials, imports*
### Custom Widget Definition API
-| Method | Endpoint | Description |
-| -------- | ----------------------------------- | --------------------------- |
-| `POST` | `/api/widgets` | Create widget definition |
-| `GET` | `/api/widgets` | List all widget definitions |
-| `GET` | `/api/widgets/:slug` | Get widget definition |
-| `PATCH` | `/api/widgets/:slug` | Update widget definition |
-| `DELETE` | `/api/widgets/:slug` | Delete widget definition |
-| `POST` | `/api/widgets/:slug/execute` | Execute server code |
+| Method | Endpoint | Description |
+| -------- | ---------------------------- | --------------------------- |
+| `POST` | `/api/widgets` | Create widget definition |
+| `GET` | `/api/widgets` | List all widget definitions |
+| `GET` | `/api/widgets/:slug` | Get widget definition |
+| `PATCH` | `/api/widgets/:slug` | Update widget definition |
+| `DELETE` | `/api/widgets/:slug` | Delete widget definition |
+| `POST` | `/api/widgets/:slug/execute` | Execute server code |
### Credential API
@@ -283,15 +294,15 @@ OpenClaw: *validates, checks credentials, imports*
### Dashboard API
-| Method | Endpoint | Description |
-| -------- | --------------------------- | ------------------------------ |
-| `GET` | `/api/widgets/instances` | List widgets on dashboard |
-| `POST` | `/api/widgets/instances` | Add widget to dashboard |
-| `PATCH` | `/api/widgets/instances/:id`| Update widget instance |
-| `DELETE` | `/api/widgets/instances/:id`| Remove widget from dashboard |
-| `GET` | `/api/layout` | Get layout and theme |
-| `PUT` | `/api/layout` | Save layout/theme |
-| `GET` | `/api/snapshot` | Dashboard snapshot for AI |
+| Method | Endpoint | Description |
+| -------- | ---------------------------- | ---------------------------- |
+| `GET` | `/api/widgets/instances` | List widgets on dashboard |
+| `POST` | `/api/widgets/instances` | Add widget to dashboard |
+| `PATCH` | `/api/widgets/instances/:id` | Update widget instance |
+| `DELETE` | `/api/widgets/instances/:id` | Remove widget from dashboard |
+| `GET` | `/api/layout` | Get layout and theme |
+| `PUT` | `/api/layout` | Save layout/theme |
+| `GET` | `/api/snapshot` | Dashboard snapshot for AI |
### Widget Package API
@@ -302,11 +313,11 @@ OpenClaw: *validates, checks credentials, imports*
### Widget Data API
-| Method | Endpoint | Description |
-| ------ | ---------------------------- | ----------------------------------- |
-| `POST` | `/api/widgets/proxy` | Proxy API calls with credentials |
-| `POST` | `/api/widgets/:slug/refresh` | Request data refresh (webhook/agent)|
-| `GET` | `/api/widgets/:slug/cache` | Get cached widget data |
+| Method | Endpoint | Description |
+| ------ | ---------------------------- | ------------------------------------ |
+| `POST` | `/api/widgets/proxy` | Proxy API calls with credentials |
+| `POST` | `/api/widgets/:slug/refresh` | Request data refresh (webhook/agent) |
+| `GET` | `/api/widgets/:slug/cache` | Get cached widget data |
### Widget SDK Components
diff --git a/public/icon.png b/public/icon.png
new file mode 100644
index 0000000..2b53a77
Binary files /dev/null and b/public/icon.png differ
diff --git a/public/icon.svg b/public/icon.svg
new file mode 100644
index 0000000..fe16a47
--- /dev/null
+++ b/public/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/logo-dark.svg b/public/logo-dark.svg
new file mode 100644
index 0000000..fcca681
--- /dev/null
+++ b/public/logo-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/logo-text.png b/public/logo-text.png
new file mode 100644
index 0000000..c18764b
Binary files /dev/null and b/public/logo-text.png differ
diff --git a/public/logo.svg b/public/logo.svg
new file mode 100644
index 0000000..fe16a47
--- /dev/null
+++ b/public/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/app/icon.tsx b/src/app/icon.tsx
new file mode 100644
index 0000000..674eebb
--- /dev/null
+++ b/src/app/icon.tsx
@@ -0,0 +1,51 @@
+import { ImageResponse } from "next/og";
+
+// Route segment config
+export const runtime = "edge";
+
+// Image metadata
+export const size = {
+ width: 32,
+ height: 32,
+};
+export const contentType = "image/png";
+
+// Image generation
+export default function Icon() {
+ return new ImageResponse(
+ (
+
+ ),
+ {
+ ...size,
+ }
+ );
+}
diff --git a/src/components/marketing/Footer.tsx b/src/components/marketing/Footer.tsx
index 3a0b3e3..942f8cb 100644
--- a/src/components/marketing/Footer.tsx
+++ b/src/components/marketing/Footer.tsx
@@ -1,4 +1,5 @@
import Link from "next/link";
+import Image from "next/image";
export function Footer() {
return (
@@ -6,11 +7,13 @@ export function Footer() {
-
-
- G
-
-
+ Glance
diff --git a/src/components/marketing/Header.tsx b/src/components/marketing/Header.tsx
index adb309a..521b1ae 100644
--- a/src/components/marketing/Header.tsx
+++ b/src/components/marketing/Header.tsx
@@ -1,4 +1,5 @@
import Link from "next/link";
+import Image from "next/image";
import { Button } from "@/components/ui/button";
// NEXT_PUBLIC_VERCEL_ENV is set automatically by Vercel (production, preview, or development)
@@ -9,9 +10,13 @@ export function Header() {