{"id":50606914,"url":"https://github.com/remcostoeten/dev-widget","last_synced_at":"2026-06-06T00:02:30.275Z","repository":{"id":338470971,"uuid":"1154433635","full_name":"remcostoeten/dev-widget","owner":"remcostoeten","description":"Lightweight, configurable dev widget for route navigation, auth testing, environment debugging, and workflow shortcuts.","archived":false,"fork":false,"pushed_at":"2026-02-14T16:35:56.000Z","size":201,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-15T01:13:08.641Z","etag":null,"topics":["auth","debugging","dev-experience","developer-tools","developer-widget","devtools","environment","frontend","productivity","react","routes","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":false,"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/remcostoeten.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-10T11:36:32.000Z","updated_at":"2026-02-14T16:38:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/remcostoeten/dev-widget","commit_stats":null,"previous_names":["remcostoeten/dev-widget"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/remcostoeten/dev-widget","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcostoeten%2Fdev-widget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcostoeten%2Fdev-widget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcostoeten%2Fdev-widget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcostoeten%2Fdev-widget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remcostoeten","download_url":"https://codeload.github.com/remcostoeten/dev-widget/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcostoeten%2Fdev-widget/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33964367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["auth","debugging","dev-experience","developer-tools","developer-widget","devtools","environment","frontend","productivity","react","routes","typescript"],"created_at":"2026-06-06T00:02:29.719Z","updated_at":"2026-06-06T00:02:30.267Z","avatar_url":"https://github.com/remcostoeten.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @remcostoeten/dev-widget\n\n[![npm version](https://img.shields.io/npm/v/@remcostoeten/dev-widget)](https://www.npmjs.com/package/@remcostoeten/dev-widget)\n[![CI](https://github.com/remcostoeten/dev-widget/actions/workflows/ci.yml/badge.svg)](https://github.com/remcostoeten/dev-widget/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nMinimal, type-safe dev widget for React apps.\n\n## Installation\n\n```bash\nbun add @remcostoeten/dev-widget\n```\n\n## React usage\n\n```tsx\nimport { DevWidget } from '@remcostoeten/dev-widget/react'\n\nexport function App(): React.ReactElement {\n\treturn (\n\t\t\u003c\u003e\n\t\t\t\u003cmain\u003eApp\u003c/main\u003e\n\t\t\t\u003cDevWidget\n\t\t\t\tmode='development-only'\n\t\t\t\ttheme={{ mode: 'system', accent: '#3bb273' }}\n\t\t\t\tfeatures={{\n\t\t\t\t\tperformance: { enabled: true, fpsThreshold: 50 },\n\t\t\t\t\tauth: { enabled: true, provider: 'better-auth' }\n\t\t\t\t}}\n\t\t\t/\u003e\n\t\t\u003c/\u003e\n\t)\n}\n```\n\n## Features\n\n- Auth domain\n- Routes domain\n- Links domain\n- Performance domain\n- System domain\n- Monitor domain\n\n## Feature checklist\n\n- [x] React widget shell with tab categories\n- [x] Domain lifecycle (setup/start/stop) via runtime registry\n- [x] Plugin API with typed event subscription\n- [x] Event bus for cross-domain communication\n- [x] Next.js log ingestion route handler\n- [x] In-memory storage adapter\n- [x] Tauri storage adapter export\n- [x] Route discovery adapter for Next.js and React projects\n- [x] Right rail with diagnostics render panel\n- [x] Keyboard shortcuts (toggle + Escape)\n- [x] Accessibility: focus-visible, reduced-motion handling, live region announcements\n- [x] Internal subpath export (`@remcostoeten/dev-widget/internal`)\n- [x] Source maps and declaration output in package build\n- [x] CI publish artifact validation step\n- [x] Demo app build pipeline\n\n## Needs additional work\n\n- AI providers: `openai` and `local` modes are declared but not implemented yet; only `rules` and `custom` are active (`src/domains/performance/aiProviderFactory.ts`).\n- Runtime prop updates: `DevWidget` memoizes runtime by `shouldRender` only, so runtime does not re-bootstrap when non-visibility props change after mount (`src/devWidget.tsx`).\n- Storage wiring: `providers.storage` is part of public config but not wired into runtime/domain persistence flow yet (`src/types/public.ts` and `src/core/bootstrap.ts`).\n- Endpoint validation: Next log handler accepts event payloads without schema validation; malformed event shapes can be persisted (`src/adapters/next/routeHandler.ts`).\n- CI parity: local checks pass, but final release confidence still depends on a pushed branch and green remote GitHub Actions run.\n\n## Plugin API\n\n```ts\nimport { createRuntime } from '@remcostoeten/dev-widget'\n\nconst runtime = createRuntime({ mode: 'always' })\n\nawait runtime.registerPlugin({\n\tid: 'my-plugin',\n\tversion: '1.0.0',\n\tregister(ctx) {\n\t\tctx.onEvent('performance/drop-detected', function onDrop(payload) {\n\t\t\tconsole.log('FPS drop:', payload.fps)\n\t\t})\n\t}\n})\n```\n\n## Subpath exports\n\n```ts\nimport { DevWidget } from '@remcostoeten/dev-widget/react'\nimport { createLogHandler } from '@remcostoeten/dev-widget/next'\nimport { createTauriStorage } from '@remcostoeten/dev-widget/tauri'\nimport type { WidgetDomain } from '@remcostoeten/dev-widget/internal'\n```\n\n## Accessibility\n\nThe widget includes keyboard shortcuts, focus-visible styling, live announcements, and reduced-motion support.\nSee `specs/10-dev-widget-accessibility-keyboard-spec.md` for the detailed behavior contract.\n\n## Core options\n\n- `enabled?: boolean`\n- `mode?: 'development-only' | 'always'`\n- `theme?: { mode?: 'system' | 'light' | 'dark'; accent?: string; density?: 'compact' | 'comfortable'; radius?: 'none' | 'sm' | 'md' | 'lg' }`\n- `features?: { auth?: boolean | AuthOptions; routes?: boolean | RoutesOptions; performance?: boolean | PerfOptions; system?: boolean | SystemOptions; links?: boolean | LinksOptions }`\n- `disable?: FeatureId[]`\n- `providers?: { auth?: AuthConfig; ai?: AiConfig; storage?: StorageConfig }`\n- `keyboard?: { toggleKey?: string; enableShortcuts?: boolean }`\n- `accessibility?: { reducedMotion?: 'system' | 'always' | 'never'; announceUpdates?: boolean }`\n- `rightRail?: { enabled?: boolean; defaultPanel?: string | null; collapsible?: boolean; panels?: PanelConfig[] }`\n\n## Changelog\n\n- [CHANGELOG.md](CHANGELOG.md)\n\n## Contributing\n\n```bash\nbun run lint\nbun run format:check\nbun run type-check\nbun test\nbun run build\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremcostoeten%2Fdev-widget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremcostoeten%2Fdev-widget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremcostoeten%2Fdev-widget/lists"}