{"id":49233351,"url":"https://github.com/nks-hub/webdev-console-plugins","last_synced_at":"2026-05-17T22:01:09.017Z","repository":{"id":352614929,"uuid":"1215875174","full_name":"nks-hub/webdev-console-plugins","owner":"nks-hub","description":"Official plugin collection for NKS WebDev Console — Apache, Nginx, PHP, MySQL, MariaDB, Redis, Composer, SSL, Cloudflare Tunnel, Mailpit, Caddy, Node, Hosts.","archived":false,"fork":false,"pushed_at":"2026-04-20T11:47:15.000Z","size":230,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-20T12:41:46.390Z","etag":null,"topics":["apache","dotnet","electron","mysql","nginx","nks-hub","php","plugins","webdev-console"],"latest_commit_sha":null,"homepage":"https://github.com/nks-hub/webdev-console","language":"C#","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/nks-hub.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":"CODEOWNERS","security":"SECURITY.md","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-04-20T10:40:43.000Z","updated_at":"2026-04-20T11:04:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nks-hub/webdev-console-plugins","commit_stats":null,"previous_names":["nks-hub/webdev-console-plugins"],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/nks-hub/webdev-console-plugins","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nks-hub%2Fwebdev-console-plugins","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nks-hub%2Fwebdev-console-plugins/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nks-hub%2Fwebdev-console-plugins/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nks-hub%2Fwebdev-console-plugins/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nks-hub","download_url":"https://codeload.github.com/nks-hub/webdev-console-plugins/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nks-hub%2Fwebdev-console-plugins/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32224417,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T10:26:35.452Z","status":"ssl_error","status_checked_at":"2026-04-24T10:25:27.643Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["apache","dotnet","electron","mysql","nginx","nks-hub","php","plugins","webdev-console"],"created_at":"2026-04-24T13:05:27.558Z","updated_at":"2026-04-24T13:05:39.669Z","avatar_url":"https://github.com/nks-hub.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CI](https://github.com/nks-hub/webdev-console-plugins/actions/workflows/ci.yml/badge.svg)](https://github.com/nks-hub/webdev-console-plugins/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/nks-hub/webdev-console-plugins?label=release)](https://github.com/nks-hub/webdev-console-plugins/releases)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![.NET](https://img.shields.io/badge/.NET-9.0-512BD4)](https://dotnet.microsoft.com/)\n[![Plugins](https://img.shields.io/badge/plugins-13-blue)](#plugins)\n\n# NKS WebDev Console — Plugins\n\nOfficial plugin collection for [NKS WebDev Console](https://github.com/nks-hub/webdev-console). Each plugin ships as an independently versioned `.zip` artifact published to GitHub Releases and indexed through [`wdc-catalog-api`](https://github.com/nks-hub/wdc-catalog-api) so the WDC daemon can install and upgrade plugins at runtime without re-installing the whole app.\n\n\u003e **Writing a new plugin?** Start with **[`docs/PLUGIN-API.md`](./docs/PLUGIN-API.md)** — the full `IWdcPlugin` interface reference, SDK helpers, DI + cross-ALC pattern, and a `Hello, plugin!` walkthrough.\n\n## Features\n\n- ✅ **13 production plugins** — Apache, Nginx, Caddy, PHP, MySQL, MariaDB, Redis, Mailpit, SSL (mkcert), Composer, Cloudflare, Node, Hosts\n- ✅ **Isolated load contexts** — each plugin runs in its own `AssemblyLoadContext`, preventing DLL version conflicts across plugins\n- ✅ **REST endpoints per plugin** — every plugin can expose `/api/plugin/\u003cid\u003e/*` with auth + logging provided by the daemon\n- ✅ **UI contributions** — plugins register sidebar nav entries, dashboard cards, per-site tabs, and config editors via `PluginUiDefinition`\n- ✅ **Lifecycle hooks** — validate / start / stop / reload for long-running services with built-in health telemetry\n- ✅ **Scriban config generation** — type-safe vhost / php.ini / fpm.conf templating per site\n- ✅ **SSE event stream** — plugins emit metrics, logs and validation progress consumed by the Electron UI\n- ✅ **Dynamic discovery** — the daemon loads plugin DLLs from its runtime directory at startup\n- ✅ **Per-plugin versioning** — shared repo tag (`v0.2.0`) ships atomic plugin bundle; individual `plugin.json` versions allow manifest-schema bumps\n\n## Requirements\n\n- .NET 9 SDK (for building)\n- NKS WebDev Console daemon ≥ 0.2.0\n- GitHub Packages access for `NKS.WebDevConsole.Plugin.SDK` NuGet (published by the parent repo on every `v*` tag)\n\n## Installation\n\nPlugins are installed through the NKS WebDev Console daemon at runtime. No manual installation is required.\n\n### Via the WDC Electron UI\n\n**Settings → Plugins → Install from Catalog** — pick the plugin and version.\n\n### Via the WDC CLI\n\n```bash\nwdc plugins list                          # available + installed\nwdc plugins install nks.wdc.apache        # install latest\nwdc plugins install nks.wdc.apache@0.2.0  # pin version\nwdc plugins enable nks.wdc.apache\n```\n\n### Via the REST API\n\n```bash\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n     -X POST http://localhost:$PORT/api/plugins/install \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"id\": \"nks.wdc.apache\", \"version\": \"0.2.0\"}'\n```\n\n## Plugins\n\n| Plugin | Purpose | Status |\n|---|---|---|\n| `NKS.WebDevConsole.Plugin.Apache`     | Apache 2.4 httpd lifecycle + vhost generator | Stable |\n| `NKS.WebDevConsole.Plugin.Caddy`      | Caddy 2 web server                           | Stable |\n| `NKS.WebDevConsole.Plugin.Cloudflare` | Cloudflare Tunnel integration                | Stable |\n| `NKS.WebDevConsole.Plugin.Composer`   | PHP Composer manager + per-site package UI   | Stable |\n| `NKS.WebDevConsole.Plugin.Hosts`      | `/etc/hosts` editor with WDC-marked section  | Stable |\n| `NKS.WebDevConsole.Plugin.Mailpit`    | Local SMTP → web inbox                       | Stable |\n| `NKS.WebDevConsole.Plugin.MariaDB`    | MariaDB server lifecycle                     | Stable |\n| `NKS.WebDevConsole.Plugin.MySQL`      | MySQL server lifecycle                       | Stable |\n| `NKS.WebDevConsole.Plugin.Nginx`      | Nginx web server                             | Stable |\n| `NKS.WebDevConsole.Plugin.Node`       | Node.js process manager                      | Stable |\n| `NKS.WebDevConsole.Plugin.PHP`        | PHP-FPM per-version manager                  | Stable |\n| `NKS.WebDevConsole.Plugin.Redis`      | Redis server lifecycle                       | Stable |\n| `NKS.WebDevConsole.Plugin.SSL`        | mkcert-based local SSL certs                 | Stable |\n\nEach plugin directory has its own `README.md` with plugin-specific manifest metadata, configuration paths, emitted events, and REST endpoints.\n\n## Plugin Capabilities\n\nA WDC plugin is a .NET 9 class library that implements `IWdcPlugin` (defined in `NKS.WebDevConsole.Plugin.SDK`). The daemon discovers plugin assemblies at start-up, loads each in its own `AssemblyLoadContext`, and gives the plugin a chance to register services, lifecycle handlers, REST endpoints, and UI contributions.\n\n**What plugins can do:**\n\n- **Manage a long-running service process** (Apache, MySQL, …) with validate / start / stop / reload lifecycle hooks + health telemetry\n- **Generate configuration** per site via Scriban templates (vhost files, php.ini snippets, cloudflared config, etc.)\n- **Expose REST endpoints** under `/api/plugin/\u003cid\u003e/*` mounted by the daemon's reverse-proxy. Auth + logging come for free.\n- **Contribute UI** — sidebar nav entries, dashboard cards, per-site tabs, config editors — via `PluginUiDefinition`\n- **Emit events** (metrics, logs, validation progress) over SSE that the Electron frontend subscribes to\n\n**What plugins intentionally CANNOT do:**\n\n- Touch the daemon's SQLite directly (must go through `IPluginContext`)\n- Share state with other plugins outside the well-defined shared types declared in `PluginLoadContext.SharedAssemblies`\n- Run arbitrary code at assembly load — `Initialize` is the earliest lifecycle hook and it runs inside the plugin ALC\n\n## Development\n\n### Building locally\n\n```bash\ngit clone https://github.com/nks-hub/webdev-console-plugins.git\ncd webdev-console-plugins\ndotnet restore\ndotnet build -c Release\n```\n\nEach `NKS.WebDevConsole.Plugin.\u003cName\u003e/bin/Release/net9.0/` directory then contains a buildable plugin. Point the daemon at the build output with `NKS_WDC_PLUGINS_DEV_DIR=/path/to/webdev-console-plugins` for developer loopback.\n\n### Repository layout\n\n```\n.\n├── Directory.Build.props        # shared .NET build props (nullable, warnings)\n├── NKS.WebDevConsole.Plugin.*/  # one directory per plugin (13×)\n│   ├── *.csproj                 # .NET 9 class library\n│   ├── plugin.json              # manifest (id, name, version, ui, permissions)\n│   └── README.md                # plugin-specific docs\n├── docs/\n│   ├── PLUGIN-API.md            # core IWdcPlugin + SDK reference\n│   ├── WRITING-A-PLUGIN.md      # step-by-step walkthrough\n│   └── MANIFEST.md              # plugin.json schema\n└── .github/\n    ├── workflows/\n    │   ├── ci.yml               # build-on-push\n    │   └── release.yml          # tag v* → per-plugin .zip → GitHub Release\n    └── dependabot.yml           # weekly nuget + github-actions bumps\n```\n\n### Shipping a release\n\n```bash\ngit tag v0.2.0\ngit push origin v0.2.0\n```\n\nThe `Release` workflow packages every plugin into its own `.zip` and attaches them as release assets. `wdc-catalog-api` picks up the new release on its next GitHub-releases refresh and exposes the new version at `/api/v1/plugins/catalog` so running WDC instances can offer the update in-app.\n\n### Versioning\n\n- Every plugin shares the repo-level tag — e.g. tag `v0.2.0` ships `Apache@0.2.0`, `MySQL@0.2.0`, … even when an individual plugin had no code changes. This keeps the downloader logic trivial and makes rollbacks atomic across the fleet.\n- Individual plugins MAY bump their internal `plugin.json` version ahead of the next tag to signal breaking changes to the manifest schema; the tag still defines the artifact identity.\n\n## Contributing\n\nContributions are welcome! For major changes please open an issue first.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feat/amazing-feature`)\n3. Keep `dotnet build` green and add/update plugin `README.md` if behavior changes\n4. Commit your changes — one-line conventional commit messages, no AI attribution\n5. Open a Pull Request\n\nSee [`docs/PLUGIN-API.md`](./docs/PLUGIN-API.md) for the plugin interface and [`docs/WRITING-A-PLUGIN.md`](./docs/WRITING-A-PLUGIN.md) for a step-by-step walkthrough.\n\n## Security\n\nPlugin DLLs ship unsigned today — verify via SHA-256 on the catalog entry until codesigning lands. Report vulnerabilities privately per [`SECURITY.md`](./SECURITY.md).\n\n## Support\n\n- 📧 **Email:** dev@nks-hub.cz\n- 🐛 **Bug reports:** [GitHub Issues](https://github.com/nks-hub/webdev-console-plugins/issues)\n- 🔗 **Main project:** [nks-hub/webdev-console](https://github.com/nks-hub/webdev-console)\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n---\n\n\u003cp align=\"center\"\u003e\n  Made with ❤️ by \u003ca href=\"https://github.com/nks-hub\"\u003eNKS Hub\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnks-hub%2Fwebdev-console-plugins","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnks-hub%2Fwebdev-console-plugins","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnks-hub%2Fwebdev-console-plugins/lists"}