diff --git a/README.md b/README.md index 6808d8b..d0b391d 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,23 @@ -# Glance ⚡ +

+ Glance +

-[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![Open Source](https://img.shields.io/badge/Open%20Source-100%25-brightgreen.svg)](https://github.com/acfranzen/glance) +

+ License: MIT + Open Source +

+ +

+ 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. - ![Glance Dashboard](glance.png) --- @@ -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 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() {
-
- G -
+ Glance Glance