{"id":50138856,"url":"https://github.com/slice-soft/ss-keel-devpanel","last_synced_at":"2026-05-24T00:03:27.982Z","repository":{"id":346820095,"uuid":"1191753055","full_name":"slice-soft/ss-keel-devpanel","owner":"slice-soft","description":"Official dev panel addon for Keel — real-time observability UI for development","archived":false,"fork":false,"pushed_at":"2026-05-06T20:30:51.000Z","size":124,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-06T21:34:55.314Z","etag":null,"topics":["addon","devpanel","go","keel","observability","slicesoft"],"latest_commit_sha":null,"homepage":"https://docs.keel-go.dev/en/addons/ss-keel-devpanel/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/slice-soft.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-25T14:55:08.000Z","updated_at":"2026-05-06T20:30:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/slice-soft/ss-keel-devpanel","commit_stats":null,"previous_names":["slice-soft/ss-keel-devpanel"],"tags_count":12,"template":false,"template_full_name":"slice-soft/ss-keel-addon-template","purl":"pkg:github/slice-soft/ss-keel-devpanel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slice-soft%2Fss-keel-devpanel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slice-soft%2Fss-keel-devpanel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slice-soft%2Fss-keel-devpanel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slice-soft%2Fss-keel-devpanel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/slice-soft","download_url":"https://codeload.github.com/slice-soft/ss-keel-devpanel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slice-soft%2Fss-keel-devpanel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33416316,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["addon","devpanel","go","keel","observability","slicesoft"],"created_at":"2026-05-24T00:03:20.722Z","updated_at":"2026-05-24T00:03:27.976Z","avatar_url":"https://github.com/slice-soft.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://cdn.slicesoft.dev/boat.svg\" width=\"400\" /\u003e\n\n# ss-keel-devpanel\n\nObservability dev panel for [Keel](https://keel-go.dev) applications.\nProvides a real-time UI to inspect requests, logs, addon events, routes, and configuration — all embedded in your Go binary.\n\n[![CI](https://github.com/slice-soft/ss-keel-devpanel/actions/workflows/ci.yml/badge.svg)](https://github.com/slice-soft/ss-keel-devpanel/actions)\n[![Release](https://img.shields.io/github/v/release/slice-soft/ss-keel-devpanel)](https://github.com/slice-soft/ss-keel-devpanel/releases)\n![Go](https://img.shields.io/badge/Go-1.25+-00ADD8?logo=go\u0026logoColor=white)\n[![Go Report Card](https://goreportcard.com/badge/github.com/slice-soft/ss-keel-devpanel)](https://goreportcard.com/report/github.com/slice-soft/ss-keel-devpanel)\n[![Go Reference](https://pkg.go.dev/badge/github.com/slice-soft/ss-keel-devpanel.svg)](https://pkg.go.dev/github.com/slice-soft/ss-keel-devpanel)\n![License](https://img.shields.io/badge/License-MIT-green)\n![Made in Colombia](https://img.shields.io/badge/Made%20in-Colombia-FCD116?labelColor=003893)\n\n---\n\n## Features\n\n- **Requests** — ring buffer (256 entries) with method, path, status, latency, request ID\n- **Logs** — ring buffer (512 entries) with level filter, search, and live SSE stream\n- **Addon events** — per-addon SSE stream from any `contracts.Debuggable` addon\n- **Routes** — registered Fiber routes at a glance\n- **Config** — env vars (secrets auto-redacted), Go runtime stats, addon manifests\n- **Guard** — `Enabled` flag + optional Bearer token; returns 404 when disabled\n- **Rate limiting** — 120 req/min per IP on all panel endpoints\n- **Header** — every panel response includes `X-Keel-Panel: true`\n- **Zero external deps** — htmx and CSS embedded via `//go:embed`\n\n---\n\n## 🚀 Installation\n\n```bash\nkeel add devpanel\n```\n\nThe CLI will:\n- Add `ss-keel-devpanel` to your Go module\n- Create `cmd/setup_devpanel.go` with the initialization function\n- Inject one line into `cmd/main.go` before your modules are registered\n- Add `KEEL_PANEL_ENABLED`, `KEEL_PANEL_SECRET`, and `KEEL_PANEL_PATH` to `.env`\n\nOr manually:\n\n```bash\ngo get github.com/slice-soft/ss-keel-devpanel\n```\n\n---\n\n## Quick start\n\n```go\nimport (\n    \"github.com/gofiber/fiber/v2\"\n    \"github.com/slice-soft/ss-keel-devpanel/devpanel\"\n)\n\nfunc main() {\n    panel := devpanel.New(devpanel.Config{\n        Enabled: true,                   // set false in production\n        Secret:  os.Getenv(\"PANEL_SECRET\"), // optional Bearer token\n        Path:    \"/keel/panel\",          // default path\n    })\n    defer panel.Shutdown()\n\n    app := fiber.New()\n\n    // Capture incoming requests (place before your routes).\n    app.Use(panel.RequestMiddleware())\n\n    // Optional: defence-in-depth guard at app level.\n    app.Use(panel.GlobalGuard())\n\n    // Mount the panel UI.\n    panel.Mount(app)\n\n    // Your application routes.\n    app.Get(\"/api/users\", handleUsers)\n\n    app.Listen(\":3000\")\n}\n```\n\nOpen `http://localhost:3000/keel/panel` in your browser.\n\n---\n\n## Logger\n\nUse `PanelLogger` to associate logs with requests in the panel:\n\n```go\nlogger := panel.Logger()\n\napp.Use(func(c *fiber.Ctx) error {\n    reqLogger := logger.WithRequestID(c.Get(\"X-Request-ID\"))\n    c.Locals(\"logger\", reqLogger)\n    return c.Next()\n})\n\n// In a handler:\nlog := c.Locals(\"logger\").(*devpanel.PanelLogger)\nlog.Info(\"user fetched: %s\", userID)\n```\n\n---\n\n## Addon integration\n\nAny addon implementing `contracts.Debuggable` can self-register:\n\n```go\nfunc (a *MyAddon) Register(app *keel.App) error {\n    if panel, ok := app.GetAddon(\"devpanel\").(contracts.PanelRegistry); ok {\n        panel.RegisterAddon(a)\n    }\n    return nil\n}\n```\n\nAddons that also implement `contracts.Manifestable` expose version, capabilities, resources, and env vars on the Config page.\n\n---\n\n## Configuration\n\n| Field     | Type   | Default        | Description                              |\n|-----------|--------|----------------|------------------------------------------|\n| `Enabled` | bool   | `true`         | Enable the panel. Set `false` in prod.   |\n| `Secret`  | string | `\"\"`           | Bearer token. Empty = no auth required.  |\n| `Path`    | string | `/keel/panel`  | URL prefix for all panel routes.         |\n\nEnv vars declared in the panel's own manifest:\n\n| Key                  | Secret | Default        |\n|----------------------|--------|----------------|\n| `KEEL_PANEL_ENABLED` | no     | `true`         |\n| `KEEL_PANEL_SECRET`  | yes    | *(empty)*      |\n| `KEEL_PANEL_PATH`    | no     | `/keel/panel`  |\n\n---\n\n## Security\n\n- **Always set `Enabled: false` in production** unless you intend to expose the panel.\n- Use `Secret` with a strong random token and HTTPS when exposing the panel.\n- `GlobalGuard()` provides an extra layer at the app middleware level (defence in depth).\n- Secret env var values are automatically redacted (`••••••••`) on the Config page.\n- Addon event `Detail` fields are displayed as-is — addons must not put sensitive data in events.\n\n---\n\n## 🤚 CI/CD and releases\n\nEvery PR runs `go test -race ./...` and `go vet ./...` via the reusable pipeline in `ss-pipeline`. Releases are created automatically by `release-please` on every merge to `main`.\n\n---\n\n## 💡 Recommendations\n\n- **Disable in production** — set `KEEL_PANEL_ENABLED=false` or `Enabled: false` in all production environments.\n- **Protect with a secret** — set `KEEL_PANEL_SECRET` to a strong random token and serve the app over HTTPS whenever the panel is enabled.\n- **Register your addons** — any addon implementing `contracts.Debuggable` can self-register with the panel to stream live events; addons implementing `contracts.Manifestable` also appear in the Config tab.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for local setup.\nThe base workflow, commit conventions, and community standards live in [ss-community](https://github.com/slice-soft/ss-community/blob/main/CONTRIBUTING.md).\n\n## Community\n\n| Document | |\n|---|---|\n| [CONTRIBUTING.md](https://github.com/slice-soft/ss-community/blob/main/CONTRIBUTING.md) | Workflow, commit conventions, and PR guidelines |\n| [GOVERNANCE.md](https://github.com/slice-soft/ss-community/blob/main/GOVERNANCE.md) | Decision-making, roles, and release process |\n| [CODE_OF_CONDUCT.md](https://github.com/slice-soft/ss-community/blob/main/CODE_OF_CONDUCT.md) | Community standards |\n| [VERSIONING.md](https://github.com/slice-soft/ss-community/blob/main/VERSIONING.md) | SemVer policy and breaking changes |\n| [SECURITY.md](https://github.com/slice-soft/ss-community/blob/main/SECURITY.md) | How to report vulnerabilities |\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n## Links\n\n- Website: [keel-go.dev](https://keel-go.dev)\n- Documentation: [docs.keel-go.dev](https://docs.keel-go.dev)\n- GitHub: [github.com/slice-soft/ss-keel-devpanel](https://github.com/slice-soft/ss-keel-devpanel)\n\n---\n\nMade by [SliceSoft](https://slicesoft.dev) — Colombia\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslice-soft%2Fss-keel-devpanel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fslice-soft%2Fss-keel-devpanel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslice-soft%2Fss-keel-devpanel/lists"}